Google apps script 我如何减少;“计算机时间”;我的谷歌应用程序脚本正在使用的?
我学习了雨果·费罗(Hugo Fierro)关于添加谷歌应用程序脚本以从谷歌表单发送电子邮件的教程。图坦卡蒙在 我定制了剧本: 1) 我将“MailApp.sendmail”API替换为“GmailApp.sendmail”,因为我收到了身份验证错误,并且电子邮件没有发送。Gmail API运行良好 2) 我添加了一个选项,可以使用“DriveApp.getFileById”随每封邮件发送PDF附件 3) 我在IF语句中添加了第二个条件,以在发送之前检查PDF文档是否可用(通过引用工作表中的一列) 问题是,如果脚本仅引用5行,那么它将在30秒内处理。当我尝试处理10行或更多行时,处理时间会显著增加 我将“sheet.getRange”替换为“sheet.getLastRow()”,试图减少脚本引用的行数Google apps script 我如何减少;“计算机时间”;我的谷歌应用程序脚本正在使用的?,google-apps-script,google-sheets,gmail,Google Apps Script,Google Sheets,Gmail,我学习了雨果·费罗(Hugo Fierro)关于添加谷歌应用程序脚本以从谷歌表单发送电子邮件的教程。图坦卡蒙在 我定制了剧本: 1) 我将“MailApp.sendmail”API替换为“GmailApp.sendmail”,因为我收到了身份验证错误,并且电子邮件没有发送。Gmail API运行良好 2) 我添加了一个选项,可以使用“DriveApp.getFileById”随每封邮件发送PDF附件 3) 我在IF语句中添加了第二个条件,以在发送之前检查PDF文档是否可用(通过引用工作表中的一列
var READY = 'READY';
var SENT = 'SENT';
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Email'); // Get the active spreadsheet, then get the "Email" sheet
var startRow = 2; // Select data row to start at
var endRow = sheet.getLastRow(); // Get the last row in the sheet
var data = sheet.getRange(startRow, 1, endRow, 6).getValues(); // Get the range of cells, then get the values
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var email = row[0]; // Column 1
var subject = row[1]; // Column 2
var message = row[2]; // Column 3
var attachment = DriveApp.getFileById(row[3]); // Returns the attachment file ID
var emailReady = row[4]; // Column 5
var emailSent = row[5]; // Column 6
var name = 'VFISA'; // Set "from" name in email
var bcc = 'myaddress@gmail.com'; // Blind carbon copy this email address
if (emailReady==READY && emailSent!==SENT) { // Prevents sending duplicates, waits for attachment cell to confirm available
GmailApp.sendEmail(email, subject, message,{
name: name,
bcc: bcc,
htmlBody: message,
attachments: attachment
});
sheet.getRange(startRow + i, 6).setValue(SENT); // Set the cell in column F to "SENT"
SpreadsheetApp.flush(); // Make sure the cell is updated right away in case the script is interrupted
}
}
}
var READY='READY';
var SENT='SENT';
函数sendEmails(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Email');//获取活动电子表格,然后获取“Email”表格
var startRow=2;//选择要开始的数据行
var endRow=sheet.getLastRow();//获取工作表中的最后一行
var data=sheet.getRange(startRow,1,endRow,6).getValues();//获取单元格范围,然后获取值
对于(变量i=0;i
我希望脚本运行得更快。我得到的错误是“服务在一天内使用了太多的计算机时间”。当我引用20行时,运行它最多需要4分钟。
DriveApp.getFileById
导致每行执行大约需要5秒。我删除了这个,现在整个脚本在不到1秒的时间内执行
我没有将PDF作为附件添加,而是使用了基于文件ID的内联链接(基于Alan Wells的建议)。我有一个类似的脚本,速度也很慢,即使没有附件,它也可以在时间用完之前处理最多40封电子邮件。您可以通过在脚本编辑器中选择“显示”然后选择“执行脚本”来检查每个操作所花费的时间。除了指南的强制性链接之外,在这种情况下最好的做法可能是执行它最后提出的建议--拆分执行。调用电子表格、驱动程序和发送邮件都需要一段时间。我假设您是在时间触发器上执行此操作的--尝试
var n=data.length>5怎么样?5:数据长度
使用i
作为for循环中的条件?作为测试,我将删除以下两行:sheet.getRange(startRow+i,6).setValue(SENT);//将F列中的单元格设置为“已发送”SpreadsheetApp.flush()
如果它对您有足够的影响,那么我会删除flush()
语句,并用其他内容替换单个单元格的setValue。您可以更新数据,然后通过一次操作将数据写回电子表格。此外,您还可以添加指向该文件的链接,而不是附件。更新:问题已解决。再次感谢。我删除了DriveApp.getFileById
,而是使用了一个内联链接(基于Alan Wells的建议)。我添加了500行,脚本执行@SheldonKennedy,请将您应用的解决方案作为答案发布。