为什么我的Google应用脚本会创建损坏的zip文件?

时间:2019-03-27 20:37:03

标签: google-apps-script google-sheets

我的Google应用程序脚本创建的zip文件“很难”在Windows桌面中打开。该zip文件不会在“文件资源管理器”中打开,但我可以在程序7zip中将其打开。这些文件是从Google表格中的列(包含文本和数字)创建的。 Notepad ++表示它们是以UTF-8编码的,并且DXF文件已更改为用逗号分隔的一行值。该文件太大,无法手动修复,因为它通常约为100,000行。

如果我不压缩文件,则Google应用程序脚本会拒绝DXF文件,因为它不受支持。 DXF文件是带有AutoCAD可以解释的一列文本的文本文件。我可以将DXF扩展名更改为TXT并单独通过电子邮件发送,但我希望文件具有正确的扩展名。

编辑(2019-04-02):我当前的问题是通过电子邮件发送或从电子表格的第三页下载可用的DXF。我可以手动执行此操作,但是我想使使用此文件的任何人都尽可能轻松。最终,我将使用结构的(x,y)位置以及每个结构的描述性文本来修改通用DXF文件,尽管下面的脚本目前不这样做。谢谢!

编辑2(2019-04-08):根据建议,我找到了一些代码来将数据格式化为CSV数组:var csv =“”; dxfValues.forEach(function(e1){csv + = e1.join(“,”)+“ \ n”;}); 添加此代码后,会在表格中的一列中创建一个可读且可用的DXF文件。它可以处理DXF文件中某些格式异常的字符和行,而无需将它们拖放或混在一起。

        var values = ss2.getDataRange().getValues();
        var filename = JobNumber + ' Structures Dips ' + new Date().getTime() + ".txt";
        DriveApp.createFile(filename, values);

        var dxfValues = ss3.getDataRange().getValues();

        var dxf_Filename = JobNumber + ' Structures Dips ' + new Date().getTime() + ".dxf";  // DXF file name
        var folder = "---folder id---"; // Folder ID

        var csv = "";
        dxfValues.forEach(function(e1) {csv += e1.join(",") + "\n";});

        var url = DriveApp.getFolderById(folder).createFile(dxf_Filename, csv, MimeType.CSV);

        var Dipblob = DriveApp.getFilesByName(filename).next().getBlob();
        var DXFblob = DriveApp.getFilesByName(dxf_Filename).next().getBlob();


        var zip = Utilities.zip([Dipblob , DXFblob]);


        MailApp.sendEmail({
                           to: "--email address---",
                           subject: filename,
                          htmlBody: "Hello <br><br>" + "Here are the generated dip files",
                           attachments: [zip],
                           name: 'Scot May'
                          });
       }

我想通过电子邮件发送包含文本文件和DXF文件的zip文件,或者在电子邮件中附加filename.txt和filename.dxf。谢谢。 **问题已解决,请参见上文**

1 个答案:

答案 0 :(得分:1)

通过在2D数组中正确创建文件,也许可以解决DXF中“错误”内容格式的问题。

例如,此函数将2D数组转换为CSV:

copyArr

看起来DXF格式是一列,因此您可能将/** * Construct a CSV representation of an array. Adds quoting and escaping as needed. * @param {Array[]} myArr A 2D array to be converted into a CSV string * @return {string} A string representing the rows of the input array, joined by CRLF. */ function array2CSV_(myArr) { return myArr.map(_row4CSV).join("\r\n"); /** * Ensure the given value is CSV-compatible, by escaping special characters and adding double-quotes if needed. * @param {any} value An array element to be encapsulated into a CSV string. * @return {string} A string that will interpreted as a single element by a CSV reader. */ function _val4CSV(value) { const str = (typeof value === 'string') ? value : value.toString(); if (str.indexOf(',') !== -1 || str.indexOf("\n") !== -1 || str.indexOf('"') !== -1) return '"' + str.replace(/"/g, '""') + '"'; else return str; } /** * Construct a CSV representation of in the input array. * @param {Array} row A 1-D array of elements which may be strings or other types which support toString(). * @return {string} A string that will be interpreted as a single row by a CSV reader. */ function _row4CSV(row) { return row.map(_val4CSV).join(","); } } row而不是逗号连接在一起。也许DXF也不需要和CSV一样的转义,所以您对值格式器的实现也可能会更加简单。