我需要使用JavaScript循环一个工作的Google应用程序脚本。(PDF邮件合并)

我需要使用JavaScript循环一个工作的Google应用程序脚本。(PDF邮件合并),javascript,google-apps-script,Javascript,Google Apps Script,经过一番修改,我终于得到了一个很好的PDF邮件合并谷歌应用程序脚本,可以满足我的需要。我现在的问题是,我希望“邮件合并PDF”功能在电子表格中的每一行都运行,可能在遇到空行时停止。我想有一种更有效的方法,使用数组。在这一点上,我有点不知所措 我已经尽可能地将代码文档化,以使其可重用。脚本在其当前状态下工作正常,但仅限于处理一行 问候 新的_2_代码 //在Google工作表中创建自定义脚本菜单,该脚本位于其中以及数据所在的位置。 函数onOpen(){ 变量菜单项=[{ 名称:“长期服务奖生成

经过一番修改,我终于得到了一个很好的PDF邮件合并谷歌应用程序脚本,可以满足我的需要。我现在的问题是,我希望“邮件合并PDF”功能在电子表格中的每一行都运行,可能在遇到空行时停止。我想有一种更有效的方法,使用数组。在这一点上,我有点不知所措

我已经尽可能地将代码文档化,以使其可重用。脚本在其当前状态下工作正常,但仅限于处理一行

问候 新的_2_代码

//在Google工作表中创建自定义脚本菜单,该脚本位于其中以及数据所在的位置。
函数onOpen(){
变量菜单项=[{
名称:“长期服务奖生成器”,
函数名:“PDFMailMerge”
}];
var ss=SpreadsheetApp.getActiveSpreadsheet();
ss.addMenu(“自定义脚本”,菜单);
}
函数PDFMailMerge(){
//输入要用作文档模板的Google文档的ID。
var sleepINT=1500
var templateid=“1g0-ydpwzskjcrz_ykgaqhfff56dmp4ora1t1mnppa”;//模板文件id
var ss=SpreadsheetApp.getActiveSpreadsheet();
ss.toast(“10%:获得模板表”);
睡眠(sleepINT);
var sheet=ss.getActiveSheet();
var data=sheet.getRange(2,1,1,15).getValues();
toast(“25%:捕获的模板数据”);
睡眠(sleepINT);
//制作一份长期服务奖励模板的副本,然后用长期服务奖励电子表格中的数据填充该模板。
用于(数据中的var i){
var行=数据[i];
var docid=DriveApp.getFileById(templateid.makeCopy().getId();
var doc=DocumentApp.openById(docid);
var body=doc.getActiveSection();
正文.replaceText(“%Preferred_Name%”,第[0]行);
正文.replaceText(“%Last_Name%”,第[1]行);
正文.replaceText(“%Emp_No%”,第[2]行);
正文.replaceText(“%EMAIL%”,第[3]行);
正文.replaceText(“%personal\u Sub\u Area\u Desc%”,第[4]行);
正文.replaceText(“%personal\u Sub\u Area\u Desc%”,第[5]行);
doc.saveAndClose();
}
ss.toast(“40%:模板数据已被替换”);
睡眠(sleepINT);
//通过下面的URL ID指定Google驱动器文件夹。
//在指定文件夹中创建新修改模板的副本,然后从指定文件夹中删除最初修改的模板。
var file=DriveApp.getFileById(doc.getId());
var newfolder=DriveApp.getFolderById(“1x3uJOuXvKMeoZpWXV7g5nJ_tujMXymaO”);
var oldfolder=DriveApp.getFolderById(“1x3uJOuXvKMeoZpWXV7g5nJ_tujMXymaO”);
newfolder.addFile(文件);
oldfolder.removeFile(文件);
toast(“60%:模板已放在正确的文件夹中。”);
睡眠(sleepINT);
//自定义模板标题
var usernamefordoctitle=sheet.getRange(2,1,1,1).getValues()//这是获取客户名称字段(A2)
var name=doc.getName();
doc.setName('的模板名+usernamefordoctitle);
ss.toast(“70%:命名新长期服务奖”);
睡眠(sleepINT);
//在下面设置Google Drive文件夹的URL ID。通过此方法生成的.PDF文件将存储在此文件夹中。
//使用脚本前面创建的修改模板创建PDF文件,并根据模板标题命名生成的.PDF文件
var pdffolder=DriveApp.getFolderById(“1x3uJOuXvKMeoZpWXV7g5nJ_tujMXymaO”);
var pdfFILE=DriveApp.getFileById(doc.getId()).getAs('application/pdf');
setName(doc.getName()+“.pdf”);
var of文件夹=PDF文件夹;
var theFile=DriveApp.createFile(pdfFILE);
theFolder.addFile(theFile);
ss.toast(“80%:PDF生成”);
睡眠(sleepINT);
//向收件人发送电子邮件(Colmun D中的电子邮件值)-附加先前创建的PDF文件。
var pdfEMAIL=DriveApp.getFileById(doc.getId()).getAs('application/pdf').getBytes();
var message=“Hi”+usernamefordoctitle+”!,请查收随附的发票。\n谢谢!\n谢谢”;
var emailAdd=sheet.getRange(“D2”).getValue()
var emailTo=emailAdd;//在此处添加客户电子邮件
var subject=“长期服务奖”+usernamefordoctitle;
附加变量={
文件名:“+usernamefordoctitle+.pdf”长期服务奖,
内容:pdfEMAIL,,
mimeType:'application/pdf'
};
MailApp.sendEmail(emailTo、主题、消息、{
附件:[附上]
});
toast(“90%:“+usernamefordoctitle+”已通过电子邮件发送。”);
睡眠(sleepINT);
ss.toast(“100%:已创建“+usernamefordoctitle+”的模板。文档ID:“+docid”);
睡眠(sleepINT);
}
var sheet=ss.getActiveSheet();
对于(var index=1;index
Hi Liora,你给我的那段话似乎很管用。它每行运行一次脚本,这是我一直在寻找的。现在的问题是,它仍然只处理第一行。我想我可以在需要脚本从下一行读取数据的部分中使用与您类似的for循环。将修补它,一旦我有了一个工作版本,我会把它发布在这里,供大家使用。(再次感谢您的帮助。)
var sheet = ss.getActiveSheet();
for(var index = 1; index < sheet.getLastRow(); index++)
{
    var data = sheet.getRange(index,1,1,15).getValues();
    for (var i in data) {
        var row = data[i];
        //your code here
    }
}