【问题标题】:Why is my Google app script creating corrupt zip files?为什么我的 Google 应用脚本会创建损坏的 zip 文件?
【发布时间】:2019-03-27 20:37:02
【问题描述】:

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

如果我不压缩文件,谷歌应用程序脚本会拒绝 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 的电子邮件。谢谢。 ** 问题已解决,见上文**

【问题讨论】:

  • Windows 资源管理器无法打开 zip 文件这一事实并不意味着它已损坏。 zip 的各种 Windows 资源管理器实现从一开始就存在差距。他们通常在处理大文件和跨文件时遇到问题。如果 7zip 有效,为什么不使用它?
  • 我的目标是将这份 Google 表格、脚本和表格分发给我公司的其他人。为了便于采用,我不想强​​迫他们使用 7zip。 (编辑 - 另外,我不知道 Windows)
  • 如果您要分发,请立即停止并创建一个附加组件。你只想更新一件事。
  • 我会这样做的。
  • 在您的问题中包含一个示例表数据布局和一个应该创建的正确 DXF 文件示例。

标签: google-apps-script google-sheets


【解决方案1】:

您的 DXF 中“错误”内容格式的问题可能已通过从 2D 数组正确创建文件得到解决。

例如,此函数将二维数组转换为 CSV:

/**
 * 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(",");
  }
}

看起来 DXF 格式是单列,因此您可能会将row" " 连接起来,而不是逗号。或许 DXF 也不需要像 CSV 那样进行转义,因此值格式化程序的实现也可以非常简单。

【讨论】:

  • 谢谢,我会调查一下,让你知道。
  • @scot 运气好吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多