Я не могу понять, почему Google Appscript отправляет реальный файл вместо копии - PullRequest
1 голос
/ 12 октября 2019

Итак, я недавно работал над проектом с листами Google, где я получаю некоторые данные и создаю файлы с этими данными для отправки по электронной почте в виде вложений. Я

  • копирую файл моего шаблона
  • , задаю имя для этого файла копии шаблона
  • , открываю его с новым идентификатором копии
  • и выполняю мойзамены тегов (изменение значений файла шаблона копирования)
  • отправка его по электронной почте

    function sendEmail(){
        for (var row in rangeData) {
          var varify = false;
          var fileName = new Date().toString();
          Logger.log("template " + templateId);
          var fileId = DriveApp.getFileById(templateId).makeCopy().getId();
          DriveApp.getFileById(fileId).setName(fileName);
          var body = DocumentApp.openById(fileId).getBody();
          Logger.log('current row ' + rangeData[row]);
          for (var column in rangeData[row]) {
            var target = firstRowMapped.indexOf(columnNames[column]);
            if (target != -1) {
              Logger.log('found Key');
              try {
                body.replaceText(firstRowMapped[target].toString(), rangeData[row] 
                [target].toString());
                varify = true;
              } catch (err) {
                Logger.log(err);
              }
            }
          }
          if (varify == true) {
            var toSend = DocumentApp.openById(fileId);
            // send mail
            try {
              MailApp.sendEmail(rangeData[row][emailColumn], 'Test Email', rangeData[row][0], {
                name: 'Emailer Script from DOER',
                cc: rangeData[row][ccColumn],
                attachments: toSend.getAs(MimeType.PDF)
              });
              Logger.log('sent');
            } catch (err) {
              Logger.log(err);
            } 
          }
        }
      }

Я получаю ожидаемые файлы на диске Google. Идентификатор этих файлов совпадает с toSend, но когда я получаю свою электронную почту, я получаю fileId. Я пытался понять это в течение нескольких дней, не повезло. Кто-нибудь знает, почему это может происходить? Есть идеи? Я лично отправил бесчисленные вложения через этот процесс (но не с помощью шаблона), и у меня никогда не было этой проблемы.

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

Код в вопросе открывает два экземпляра файла, изменяя один, а затем отправляя другой (неизмененный) экземпляр. Чтобы это исправить, вы можете:

сохранить и закрыть первый экземпляр перед открытием другого

/* globals
   rangeData, templateId, firstRowMapped,columnNames, emailColumn, ccColumn */

function sendEmail() {

    ...

    var doc = DocumentApp.openById(fileId);
    var body = doc.getBody();

    ...

    doc.saveAndClose();

    if (varify == true) {
      var toSend = DocumentApp.openById(fileId);
      // send mail
      ...

}

или открыть только один экземпляр, иотправить тот же, что вы изменили

// Don't close the doc before this 
var toSend = doc;
1 голос
/ 13 октября 2019

Повторное открытие и сохранение исправили мои ошибки.

        var editFile = DocumentApp.openById(fileId);
        var body = editFile.getBody();
        var target = firstRowMapped.indexOf(columnNames[column]);
        if (target != -1) {
          Logger.log('found Key');
          try {
            Logger.log('row column ' + rangeData[row][target] + ' replacing ' + 
            firstRowMapped[target]);
            body.replaceText(firstRowMapped[target].toString(), rangeData[row] 
            [target].toString());
            Logger.log('replaced Key');
            varify = true;
            editFile.saveAndClose();
...