2我有一个在线网络表单,我正在使用谷歌表格进行大量提交。
代码适用于几条记录但是当我添加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));
对此:
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
脚本的执行甚至没有像Update 1中那样达到UrlFetchApp.fetchAll(rqs);
。
我真的希望这是有道理的,如果我能得到一些帮助吗?