Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 我如何减少;“计算机时间”;我的谷歌应用程序脚本正在使用的?_Google Apps Script_Google Sheets_Gmail - Fatal编程技术网

Google apps script 我如何减少;“计算机时间”;我的谷歌应用程序脚本正在使用的?

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文档是否可用(通过引用工作表中的一列

我学习了雨果·费罗(Hugo Fierro)关于添加谷歌应用程序脚本以从谷歌表单发送电子邮件的教程。图坦卡蒙在

我定制了剧本:

1) 我将“MailApp.sendmail”API替换为“GmailApp.sendmail”,因为我收到了身份验证错误,并且电子邮件没有发送。Gmail API运行良好

2) 我添加了一个选项,可以使用“DriveApp.getFileById”随每封邮件发送PDF附件

3) 我在IF语句中添加了第二个条件,以在发送之前检查PDF文档是否可用(通过引用工作表中的一列)

问题是,如果脚本仅引用5行,那么它将在30秒内处理。当我尝试处理10行或更多行时,处理时间会显著增加

我将“sheet.getRange”替换为“sheet.getLastRow()”,试图减少脚本引用的行数

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,请将您应用的解决方案作为答案发布。