javascript - 如何使用数组进行优化?

标签 javascript google-apps-script google-apps

我开始学习使用 JavaScript 的 google 应用脚本。 我写了这段代码,但是它真的很慢并且执行该函数需要很长时间。我认为这不是执行该功能的最佳方式。 是否有任何选项/方式(数组)可以使其更快或以其他方式减少等待时间? 我想做的就是在一个列单元格值设置为 true 时在另一个单元格列中插入“今天的日期”。

function onEdit() {
  sConfDate();
}

function sConfDate(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheetByName("Data");
  var dataRange = dataSheet.getRange(9, 1, dataSheet.getLastRow(), 43);
  var data = dataRange.getValues();
  var d = new Date();
  var dd = d.getDate();
  var mm = d.getMonth() +1;
  var yyyy = d.getFullYear();
  var date = dd + "/" + mm + "/" + yyyy;
  var needSay = 'SUC';
  var needSay2 = '-';

  for(var i = 0; i < data.length; i++){
    //row items
    var values = data[i];
    //column items
  for(var j = 0; j < values.length; j++){
    var row = values[j];
    var checkRow = row;
    //Logger.log(checkRow);
       if(checkRow === needSay && checkRow === needSay2){
         dataSheet.getRange(9 + i, 43).setValue(date);
      };
    };
  };
}

最佳答案

也许这就是您的想法:

function sConfDate(){
  var ss=SpreadsheetApp.getActive();
  var dataSheet=ss.getSheetByName("Data");
  var dataRange=dataSheet.getRange(9, 1, dataSheet.getLastRow()-8, 43);
  var data=dataRange.getValues();
  var datacol43=dataSheet.getRange(9,43,dataSheet.getLastRow()-8,1).getValues();
  var date=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy");
  data.forEach(function(r,i){
    r.forEach(function(c,j){
      if(c=='SUC' || c=='-') {
        datacol43[i][0]=date;
      }
    });
  });
  dataSheet.getRange(9,43,dataSheet.getLastRow()-8,1).setValues(datacol43);                   
}

这实际上可能运行得更快:

function sConfDate(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Data");
  var rg=sh.getRange(9, 1, sh.getLastRow()-8, 43);
  var data=rg.getValues();
  var crg=sh.getRange(9,43,sh.getLastRow()-8,1);
  var cdata=crg.getValues();
  var date=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy");
  for(var i=0;i<data.length;i++) {
    for(var j=0;j<data[i].length;j++) {
      if(data[i][j]=='SUC' || data[i][j]=='-') {
        cdata[i][0]=date;
        break;
      }
    }
  }
  crg.setValues(cdata);                   
}

也许这样会更好。

function sConfDate2(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Data");
  var rg=sh.getRange(9, 1, sh.getLastRow()-8, 8);
  var data=rg.getValues();
  var crg=sh.getRange(9,8,sh.getLastRow()-8,1);
  var cdata=crg.getValues();
  var date=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy");
  for(var i=0;i<data.length;i++) {
    var row=data[i];//Im guessing this is probably what you want unless you have particular columns in mind
    if(row.indexOf('SUC')!=-1 && row.indexOf('-')!=-1) {
      cdata[i][0]=date;
    }
  }
  crg.setValues(cdata);                   
}

关于javascript - 如何使用数组进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59010961/

相关文章:

javascript - Google 脚本 xls 附件不显示

google-apps-script - 使用 findText() setSelection() 段落的特定部分

javascript - 从 angularjs 调用 REST 服务时本地主机上的 CORS 问题

javascript - 对从 jQuery ui 自动完成选项列表中选择的选项执行函数

javascript - 将多个参数传递给 addCallBackElement Google 脚本

google-apps-script - 谷歌脚本 : Define Variable from Library

java - 从图库中选择图像后 Android 应用程序崩溃 -cursor.getColumnIndex 返回 -1

javascript - 在 onclick 中使用变量是否比使用 e.target 更糟糕?

javascript - 如何在 if 语句返回 false 的情况下中止 jquery 函数

google-apps-script - 如何将具有基本授权的 UrlFetchApp 分配给按钮?