尝试使用 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,但这会返回相同的未定义错误。
不知道为什么,但是移动代码使它可以工作。不过,这需要很长时间,因为它在访问每条记录后都会保存并关闭 - 任何改进的评论都会受到赞赏,或者即使您可以告诉我为什么它不起作用但以前不起作用?
谢谢!
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();
}
我也有类似的问题,我需要反复读取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.
}