如何强制 Google 文档保存并关闭,然后再次打开以继续追加? (谷歌脚本)

问题描述 投票:0回答:2

尝试使用 Google 表格中的数据来完成 Google 文档中的信件。我知道我可以下载并使用 Office,但尝试学习 Javascript / Google Script 并且不确定如何解决以下问题。最初,问题是尝试附加到文档 189 次,但无法保存,尽管控制台输出和写入文档都正常。当尝试包含 SaveandClose 时,它失败并报告为未定义,尽管它以前可以工作。任何帮助请感激!

当前代码:

function mailmerge() {
  var countIndex = 0;
  var doctemplateID = "1xMHjKeB-KDx4vz4ch4aPhkkhTgEOGBZpOc7h1KsNqwI";
  var docfinalID = "1g_ZHdI2BLNk5gsxYK5pX5MbHkIpHCfASDDFtB00m1v4";
  var wsID = "1m7HdAuV0bG55oJ6jucQPsWXXb74rLzSheb8o_eSOCJM";

  var doctemplate = DocumentApp.openById(doctemplateID);
  var final = DocumentApp.openById(docfinalID);
  var templateparagraphs = doctemplate.getBody().getParagraphs();
  var ss = SpreadsheetApp.openById(wsID).getSheetByName("Sheet1");
  var data = ss.getRange(2,1,189,11).getValues();
  final.getBody().clear();
  data.forEach(function(r){
    console.log(r);
    
    createMailMerge(r[3], r[2], r[7], r[8], r[9], r[10], templateparagraphs,final);
    countIndex++;
    if (countIndex%10 == 0) {
          final.saveAndClose();
          //reopen the doc
          var final = DocumentApp.openById(docfinalID);
          }
    
  });
}


function createMailMerge(first, last, opa, opb, opc, opd, templateparagraphs, final){
    
    templateparagraphs.forEach(function(p){
    final.getBody().appendParagraph(
      p.copy()
      .replaceText("{first}",first)
      .replaceText("{last}",last)
      .replaceText("{A}",opa)
      .replaceText("{B}",opb)
      .replaceText("{C}",opc)
      .replaceText("{D}",opd)
      );

  });
  final.getBody().appendPageBreak();

}

Returns --> 9:51:20 AM  Error TypeError: Cannot read property 'getBody' of undefined(anonymous) @ Code.gs:31

Original Code:
function mailmerge() {
  
  var doctemplateID = "1xMHjKeB-KDx4vz4ch4aPhkkhTgEOGBZpOc7h1KsNqwI";
  var docfinalID = "1g_ZHdI2BLNk5gsxYK5pX5MbHkIpHCfASDDFtB00m1v4";
  var wsID = "1m7HdAuV0bG55oJ6jucQPsWXXb74rLzSheb8o_eSOCJM";

  var doctemplate = DocumentApp.openById(doctemplateID);
  var final = DocumentApp.openById(docfinalID);
  var templateparagraphs = doctemplate.getBody().getParagraphs();
  var ss = SpreadsheetApp.openById(wsID).getSheetByName("Sheet1");
  var data = ss.getRange(2,1,189,11).getValues();
  final.getBody().clear();
  data.forEach(function(r){
    console.log(r);
    
    createMailMerge(r[3], r[2], r[7], r[8], r[9], r[10], templateparagraphs,final);
    
    
  });
}


function createMailMerge(first, last, opa, opb, opc, opd, templateparagraphs, final){
    
    templateparagraphs.forEach(function(p){
    final.getBody().appendParagraph(
      p.copy()
      .replaceText("{first}",first)
      .replaceText("{last}",last)
      .replaceText("{A}",opa)
      .replaceText("{B}",opb)
      .replaceText("{C}",opc)
      .replaceText("{D}",opd)
      );

  });
  final.getBody().appendPageBreak();

}

这将返回 --> 9:56:38 AM 错误
保存文档之前应用了太多更改。请使用 Document.saveAndClose() 小批量保存更改,然后使用 Document.openById() 重新打开文档。

也曾在循环中的函数调用之后直接尝试过 SaveandClose,但这会返回相同的未定义错误。

javascript google-apps-script
2个回答
0
投票

不知道为什么,但是移动代码使它可以工作。不过,这需要很长时间,因为它在访问每条记录后都会保存并关闭 - 任何改进的评论都会受到赞赏,或者即使您可以告诉我为什么它不起作用但以前不起作用?

谢谢!

function mailmerge() {
  var empty = false;
  var doctemplateID = "1xMHjKeB-KDx4vz4ch4aPhkkhTgEOGBZpOc7h1KsNqwI";
  var docfinalID = "1g_ZHdI2BLNk5gsxYK5pX5MbHkIpHCfASDDFtB00m1v4";
  var wsID = "1m7HdAuV0bG55oJ6jucQPsWXXb74rLzSheb8o_eSOCJM";
  var sigID = "1J5JUpqtttW2fdJW_CUCIsSB50QjtpQSa";

  var doctemplate = DocumentApp.openById(doctemplateID);
  //var final = DocumentApp.openById(docfinalID);
  var templateparagraphs = doctemplate.getBody().getParagraphs();
  var ss = SpreadsheetApp.openById(wsID).getSheetByName("Sheet1");
  var data = ss.getRange(2,1,189,11).getValues();
  
  data.forEach(function(r){
    console.log(r);
    var final = DocumentApp.openById(docfinalID);
    if (empty == false){;
      final.getBody().clear();
      empty = true

    }
    createMailMerge(r[3], r[2], r[7], r[8], r[9], r[10], templateparagraphs,final);
    final.saveAndClose();
    

    
  });
}


function createMailMerge(first, last, opa, opb, opc, opd, templateparagraphs, final){
    
    templateparagraphs.forEach(function(p){
    final.getBody().appendParagraph(
      p.copy()
      .replaceText("{first}",first)
      .replaceText("{last}",last)
      .replaceText("{A}",opa)
      .replaceText("{B}",opb)
      .replaceText("{C}",opc)
      .replaceText("{D}",opd)
      );

  });
  final.getBody().appendPageBreak();

}

0
投票

我也有类似的问题,我需要反复读取sheet直到读取到新的记录,所以我找到了这段代码

while(true){
    var sheet =  SpreadsheetApp.openById("sheetId").getSheetByName("Name");
    var target = sheet.getRange(TargetCell).getValue();
    Logger.log(target);
    if(isTarget){
     break;
    }    
    SpreadsheetApp.flush(); // this is my solution.
    
}
© www.soinside.com 2019 - 2024. All rights reserved.