我可以在循环中提高UrlFetchApp.fetch()的处理速度

问题描述 投票:0回答:1

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);

我真的希望这是有道理的,如果我能得到一些帮助吗?

performance optimization google-apps-script google-apps urlfetch
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.