Почему мой скрипт приложения Google создает поврежденные zip-файлы? - PullRequest
1 голос
/ 27 марта 2019

Файл zip, который создает мой скрипт приложения Google, «трудно» открыть на рабочем столе Windows.Почтовый индекс не открывается в File Explorer, но я могу открыть его в программе 7zip.Файлы создаются из столбцов в листах Google (из смешанного текста и цифр).Notepad ++ говорит, что они закодированы в UTF-8, а файл DXF был изменен на одну строку значений, разделенных запятыми.Файл слишком велик, чтобы его можно было исправить вручную, поскольку обычно он составляет около 100 000 строк.

Если я не заархивировал файлы, скрипт приложения Google отклоняет файл DXF как неподдерживаемый.Файл DXF - это текстовый файл с колонкой текста, которую AutoCAD может интерпретировать.Я могу изменить расширение DXF на TXT и отправить его по электронной почте отдельно, но я хочу, чтобы файл имел правильное расширение.

Редактировать (2019-04-02): Моя текущая проблема - отправка по электронной почте или загрузка пригодного для использования файла DXF с третьего листа электронной таблицы.Я могу сделать это вручную, но я хочу сделать все как можно проще для любого, кто использует этот файл.В конце концов, я изменю общий файл DXF с расположением (x, y) структур вместе с описательным текстом для каждой структуры, хотя приведенный ниже сценарий не делает этого в настоящее время.Спасибо!

Редактировать 2 (2019-04-08): Основываясь на предложении, я нашел некоторый код для форматирования данных в массив CSV: var csv = "";dxfValues.forEach (function (e1) {csv + = e1.join (",") + "\ n";});При добавлении этого кода создается читаемый, пригодный для использования файл DXF из столбца в Sheets.Он обрабатывает некоторые странно отформатированные символы и строки в файле 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'
                          });
       }

Я хотел бы получить почтовый zip-файл с текстовым файлом и файлом DXF или электронное письмо, к которому прикреплены filename.txt и filename.dxf.Благодарю.** проблема решена, см. выше **

1 Ответ

1 голос
/ 28 марта 2019

Вероятно, ваша проблема с "ошибочным" форматом содержимого в 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, поэтому ваша реализация средства форматирования значений также может быть проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...