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



尝试使用谷歌表单中的数据来完成谷歌文档中的字母。我知道我可以下载并使用office,但正在尝试学习Javascript/Google Script,不确定如何解决以下问题。最初,问题是尝试向文档追加189次,但未能保存,尽管控制台输出和向文档写入都在工作。当尝试包含SaveandClose时,它失败了,final被报告为未定义,尽管它以前工作过。感谢您的帮助!

当前代码:

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,但这会返回相同的未定义错误。

不知道为什么,但移动代码使其发挥了作用。不过,它需要很长时间,因为它在每个记录被访问后都会保存和关闭——任何需要改进的评论都会受到赞赏,或者即使你能告诉我为什么它不起作用,但以前不会起作用?

谢谢!

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

最新更新