1

因此,我最近一直在使用 google sheet 开展一个项目,我在其中获取一些数据并使用该数据创建文件以作为附件发送到电子邮件中。我是

  • 复制我的模板文件
  • 为该模板复制文件设置名称
  • 使用新的副本 ID 打开它
  • 替换标签(更改复制模板文件的值)
  • 作为电子邮件发送

    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);
            } 
          }
        }
      }

我正在谷歌驱动器上获取我预期的文件。这些文件的 ID 与toSend我收到电子邮件时的 ID 匹配,但我收到了fileId. 我一直试图弄清楚这几天,没有运气。有谁知道为什么会发生这种情况?有任何想法吗?我个人通过这个过程发送了无数的附件(虽然没有使用模板),但从来没有遇到过这个问题。

4

2 回答 2

3

问题中的代码是打开文件的两个实例,修改一个,然后发送另一个(未修改的)实例。要解决此问题,您可以:

在打开另一个实例之前保存并关闭第一个实例

/* 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;
于 2019-10-12T20:46:38.933 回答
1

重新打开并保存修复了我的错误。

        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();
于 2019-10-13T03:43:02.520 回答