2 У меня есть веб-форма, и я использую лист Google для массовых отправлений.
Код отлично работает для нескольких записей, но когда я добавляю 1000 - 2000 записей, я вижу, что время обработки составляеточень долго, и для запуска и завершения скрипта требуется очень много времени.Время ожидания истекло.
Можно ли как-нибудь увеличить скорость, обновив код?
В настоящее время для каждого адреса электронной почты выполняется цикл, и я думаю, что это вызывает проблему..
Вот мой текущий код:
//sheet refers to the sheet that includes email list (email list includes "Email" as a column header
//paramValueSheet refers to the sheet that includes parameters values
var SENT_TAG = 'SEND_CONFIRMED';
var sheet = SpreadsheetApp.getActive().getSheetByName('EmailAddressSheet');
var paramValueSheet = SpreadsheetApp.getActive().getSheetByName('ParameterValuesSheet');
function myFunction() {
var startRow = 2; // First row of data to process
var getlastrow_emailList = sheet.getLastRow() - 1;
var numRows = getlastrow_emailList; // Number of rows to process
var dataRange = sheet.getRange(startRow, 1, numRows, 2);
// Fetch values for each row in the Range.
var data = dataRange.getValues();
var value1 = paramValueSheet.getRange("A1").getValue();
var value2 = paramValueSheet.getRange("A2").getValue();
// for (i in data) {
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[0]; // First column
var emailSent = row[1]; // Second column
if (emailSent != SEND_CONFIRMED) { // Prevents sending duplicates
var url = "https://www.SiteNameGoesHere.com/form?id=123456";
UrlFetchApp.fetch(url +'&EMAIL=' + encodeURIComponent(emailAddress) + '&PARAM1=' + encodeURIComponent(value1) + '&PARAM2=' + encodeURIComponent(value2));
sheet.getRange(startRow + i, 2).setValue(SENT_TAG);
// Flush to make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
//form submission
var response = UrlFetchApp.fetch("https://www.FORM_URL_HERE.com/form?process=submit");
}
ОБНОВЛЕНИЕ 1:
Чтобы реализовать UrlFetchApp.fetchAll()
для оптимизации процесса, нижеэто обновленный код, который я использую:
//sheet refers to the sheet that includes email list (email list includes "Email" as a column header
//paramValueSheet refers to the sheet that includes parameters values
var SENT_TAG = 'SEND_CONFIRMED';
var sheet = SpreadsheetApp.getActive().getSheetByName('EmailAddressSheet');
var paramValueSheet = SpreadsheetApp.getActive().getSheetByName('ParameterValuesSheet');
function myFunction() {
var startRow = 2; // First row of data to process
var getlastrow_emailList = sheet.getLastRow() - 1;
var numRows = getlastrow_emailList; // Number of rows to process
var dataRange = sheet.getRange(startRow, 1, numRows, 2);
// Fetch values for each row in the Range.
var data = dataRange.getValues();
var value1 = paramValueSheet.getRange("A1").getValue();
var value2 = paramValueSheet.getRange("A2").getValue();
var rqs = [];
var ranges = [];
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[0];
var emailSent = row[1];
if (emailSent != SEND_CONFIRMED) { // Should SEND_CONFIRMED be "SEND_CONFIRMED" or SENT_TAG?
var url = "https://www.SiteNameGoesHere.com/form?id=123456";
var req = UrlFetchApp.fetch(url +'&EMAIL=' + encodeURIComponent(emailAddress) + '&PARAM1=' + encodeURIComponent(value1) + '&PARAM2=' + encodeURIComponent(value2));
SpreadsheetApp.getUi().alert(req);
rqs.push(req);
ranges.push("B" + (startRow + i)); // Modified
}
}
UrlFetchApp.fetchAll(rqs);
sheet.getRangeList(ranges).setValue(SENT_TAG); // Modified
SpreadsheetApp.flush();
}
Этот обновленный код вызывает следующую ошибку:
"bad value"
в строке UrlFetchApp.fetchAll (rqs);
Чтобы устранить проблему, вы можете видеть, что я добавил предупреждение в этот обновленный код:
SpreadsheetApp.getUi().alert(req);
В окне предупреждения отображается значение, подобное этому:
<!DOCTYPE html><html lang="en" class="no-js" data-reactroot=""><head><meta..so on..
, который сообщает мне, что код попадает на страницу формы, а страница отображается, UrlFetchApp.fetchAll(rqs);
- вот что вызывает проблему.
ОБНОВЛЕНИЕ 2:
В целях тестирования я попытался обновить следующую строку в цикле кода UPDATE 1:
var req = UrlFetchApp.fetch(url +'&EMAIL=' + encodeURIComponent(emailAddress) + '&PARAM1=' + encodeURIComponent(value1) + '&PARAM2=' + encodeURIComponent(value2));
доis:
var req = UrlFetchApp.getRequest(url +'&EMAIL=' + encodeURIComponent(emailAddress) + '&PARAM1=' + encodeURIComponent(value1) + '&PARAM2=' + encodeURIComponent(value2));
* В основном с использованием getRequest ()
В этом случае окно предупреждения SpreadsheetApp.getUi().alert(req);
показывает мне это значение [object Object]
Ив этот раз появляется новая ошибка:
var req = UrlFetchApp.getRequest(url +'&EMAIL=' + encodeURIComponent(emailAddress) + '&PARAM1=' + encodeURIComponent(value1) + '&PARAM2=' + encodeURIComponent(value2));
Ошибка говорит:
Attribute provided with invalid value: Header:X-Forwarded-For
Выполнение сценария даже не достигает UrlFetchApp.fetchAll(rqs);
, как в обновлении 1.
Я действительно надеюсь, что это имеет смысл, и если я могу получить некоторую помощь?