1

Я пытаюсь прокрутить лист Excel, и для каждой строки отправьте электронное письмо. После отправки письма я хочу удалить эту строку.Сценарий Google Apps: служба вызывается слишком много раз за один день: электронная почта

Это однако не работает.

По какой-то причине он начинает отправлять электронные письма как сумасшедшие, и в какой-то момент он достигает предела и уходит.

Это фактически удаляет только одну строку.

Смотрите код ниже:

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="[email protected]"} 
    if (emailAddress=="Autre1"){sendto="[email protected]"} 
    if (emailAddress=="Autre2"){sendto="[email protected]"} 
    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

Тестирование его в режиме отладки. Кажется, что застрял на линии: MailApp.sendEmail (sendto, subject, message); Не уверен, что это связано с тем, что дневной лимит закончился? – R0b0tn1k

+1

попробуйте 'getLastRow' вместо' getMaxRow'. Вы можете получить много лишних данных и получить правдивые ошибки преобразования с помощью '(sendto! = '')' –

+0

Спасибо, потребуется 24 часа для тестирования. Если это работает, плохо сообщите, чтобы вы могли написать ответ и набрать очки. – R0b0tn1k

ответ

1

Вы можете найти дневной лимит here.

Что касается вашего кода, смотрящий на расшифровку исполнения, он выглядит так, что сценарий не распознает row как целое число, а как строку, он присоединяет 2 и только затем преобразует его. Таким образом, вы удаляете строку 2 (или 02), затем строку 12, затем строку 22 и так далее.

Это, однако, не имеет значения, поскольку в вашей логике есть проблема. Я попытаюсь изо всех сил объяснить это и надеюсь, что это понятно.

Если вы удаляете строку после каждой итерации, то в первой итерации она удалит строку 2 (потому что row = 0 и вы добавите 2), на второй итерации она удалит строку 3 (потому что row = 1 и вы добавите 2), но поскольку на вашей первой итерации вы уже удалили строку, данные, которые были в строке 3 в начале, теперь фактически находятся в строке 2.

Одним из способов решения этой проблемы является обратный цикл, начинающийся с максимума и количества вниз. Таким образом, когда вы удаляете строку, она не влияет на следующую. Я немного переписал ваш код, чтобы он работал так, как предполагалось.

function sendEmails() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[0]; 
    var startRow = 2; // First row of data to process 
    var lastRow = sheet.getLastRow(); // getLastRow() gives you the last row that has content, while getMaxRows gives you the maximum number of rows in your sheet 
    var range = sheet.getRange(startRow, 1, lastRow-1, 50) // -1 because you want the number of rows from your starting position and not the index of the last row 
    var values = range.getValues(); 

for (row = values.length-1; row >= 0; row--) { 
    var theID = values[row][0]; 
    var message = ""; 
    var sendto = ""; 
    var emailAddress = values[row][2]; 
    if (emailAddress=="Autre"){sendto="[email protected]"} 
    if (emailAddress=="Autre1"){sendto="[email protected]"} 
    if (emailAddress=="Autre2"){sendto="[email protected]"} 
    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

Полностью понять, и вы совершенно правы! Мне нужно подождать до завтра, чтобы проверить его, поскольку мои ограничения по электронной почте закончились. – R0b0tn1k