我试图遍历Excel工作表,并为每一行发送电子邮件。发送电子邮件后,我想删除该行。
然而,这不起作用。
出于某种原因,它开始发送疯狂的电子邮件,并在某些时候达到极限并退出。
它实际上只删除了一行。
请参阅以下代码:
function sendEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var startRow = 2; // First row of data to process
var maxRows = sheet.getMaxRows();
var range = sheet.getRange(startRow, 1, maxRows, 50)
var values = range.getValues();
for (var row in values) {
Logger.log('ID=' + values[row][0]);
var theID = values[row][0];
var message = "";
var sendto = "";
var emailAddress = values[row][2];
if (emailAddress=="Autre"){sendto="test@test.com"}
if (emailAddress=="Autre1"){sendto="test1@test.com"}
if (emailAddress=="Autre2"){sendto="test2@test.com"}
message+="\n ID: " + values[row][1];
message+="\n Project Number: " + values[row][2];
var subject = "Project ID: " + values[row][1];
if (sendto!=''){
MailApp.sendEmail(sendto, subject, message);
sheet.deleteRow(row+2)
}
}
逻辑是,如果有有效的电子邮件,请发送电子邮件,删除该行。
但是一旦执行,它只删除一行,发送疯狂的电子邮件,并收到电子邮件最大错误。
思想?
答案 0 :(得分:1)
您可以查看每日限额here。
关于你的代码,看一下执行记录,看起来脚本没有将row
识别为一个整数,而是一个字符串,它附加了2,然后才转换它。所以你要删除第2行(或02),然后删除第12行,然后删除第22行,依此类推。
然而这是无关紧要的,因为你的逻辑存在问题。我会尽力解释它并希望它是可以理解的。
如果在每次迭代后删除一行,那么在第一次迭代中它将删除第2行(因为row = 0
而你添加2),在第二次迭代中它将删除第3行(因为{{1}并且你添加2),但是因为在你的第一次迭代中你已经删除了一行,所以在开头的第3行中的数据现在实际上在第2行。
解决此问题的一种方法是通过反转循环,从最大值开始并倒计时。这样当你删除一行时它对下一行没有影响。我已经重写了你的代码,所以它应该像预期的那样工作。
row = 1
我希望这有点可以理解,我不太擅长解释事情。