Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更快地推进阵列在阵列中的位置_Javascript_Arrays_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 如何更快地推进阵列在阵列中的位置

Javascript 如何更快地推进阵列在阵列中的位置,javascript,arrays,google-apps-script,google-sheets,Javascript,Arrays,Google Apps Script,Google Sheets,我有一个数组形式的谷歌电子表格数据。现在我想推我用于循环的数组位置,它在小数据上工作良好,但当数据长度增加时,它会导致延迟。 是否有更快的方法推动阵列在阵列中的位置 以下是我当前使用的代码:- var ss = SpreadsheetApp.openById('19zxxxxxxxxxxxxxxxxxxxxxxxxOI'); var sheet1 = ss.getSheetByName('Sheet2'); var data = sheet1.getRange("A:H").getValu

我有一个数组形式的谷歌电子表格数据。现在我想推我用于循环的数组位置,它在小数据上工作良好,但当数据长度增加时,它会导致延迟。 是否有更快的方法推动阵列在阵列中的位置

以下是我当前使用的代码:-

 var ss = SpreadsheetApp.openById('19zxxxxxxxxxxxxxxxxxxxxxxxxOI');
 var sheet1 = ss.getSheetByName('Sheet2');
 var data = sheet1.getRange("A:H").getValues();
 var email = Session.getActiveUser().getEmail();

  for(var i = 0; i < data.length; i++) 
  {
  data.unshift(i+1);
 } // this for loop takes too much time.

  data = data.filter(function(item){return item[7] == email});


  var x = data.map(function(val){
    return val.slice(0, -7);
 }) 
  Logger.log(x)
  return x;

}
var ss=SpreadsheetApp.openById('19ZXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
var sheet1=ss.getSheetByName('Sheet2');
var data=sheet1.getRange(“A:H”).getValues();
var email=Session.getActiveUser().getEmail();
对于(变量i=0;i
我相信你的目标如下

  • 如果
    data.unshift(i+1)
    data[i].unshift(i+1)
    as,则当列“G”的值与
    email
    相同时,您希望检索列“A”的值。此时,您希望将行号添加到行值的第一个索引中。
    • 根据你的剧本,我是这样理解的
  • 您希望降低这种情况下的流程成本
对于这个问题,这个解决方案怎么样

模式1: 在此模式中,您的脚本将被修改。在这种情况下,结果值由一个循环检索

示例脚本: 模式2: 在这个模式中,和其他方法一样,使用TextFinder和Sheets API。在这种情况下,通过使用TextFinder搜索
电子邮件
,可以减少基础数据的大小。每一个值都是通过一个使用API表的API调用来检索的

示例脚本: 在使用此脚本之前

  • 如果
    email
    包含在其他字符串中,请使用
    matchEntireCell(true)
    进行文本查找
参考资料:

    • 你是说
      数据[i]。取消移位(i+1)
      ?啊,对了!!,但是如果排成千行的话,它可能会再次延迟。我想我没能把它放进去。谢谢。当前作业在2秒内完成,有没有更快的方法?
      先过滤
      ,然后
      取消移位
      /unshift inside map,然后再切片取消移位inside filter<代码>数据.filter((项目,i)=>项目[7]==电子邮件和项目.unshift(i+1))你们提供在线课程吗?我想成为你的学生。我如何与您联系?是的,您的回答将时间消耗从2.08秒减少到1.2秒。但是请为将来提供您的邮件地址。@Mask:虽然我们不能阻止人们交换联系方式,但堆栈溢出的目的是为将来的读者保留一个写得很好的问题和答案的目录,而私人支持渠道往往会与此相反。我的经验是,私人支持可能会给帮手带来很大的负担,并且会占用以前帮助更多人的时间。当然,我将来会处理好这件事。
      function myFunction() {
        var ss = SpreadsheetApp.openById('19zxxxxxxxxxxxxxxxxxxxxxxxxOI');
        var sheet1 = ss.getSheetByName('Sheet2');
        var data = sheet1.getRange("A1:H" + sheet1.getLastRow()).getValues();  // Modified
        var email = Session.getActiveUser().getEmail();
      
        const res = data.reduce((ar, [a,,,,,,g], i) => {  // Modified
          if (g == email) ar.push([i + 1, a]);
          return ar;
        }, []);
      
        Logger.log(res)
        return res;
      }
      
      function myFunction() {
        const spreadsheetId = '19zxxxxxxxxxxxxxxxxxxxxxxxxOI';
        const ss = SpreadsheetApp.openById(spreadsheetId);
        const sheet = ss.getSheetByName('Sheet2');
        const email = Session.getActiveUser().getEmail();
      
        // 1. Retrieve the ranges of rows by searching "email" at the column "G".
        const ranges = sheet.getRange("G1:G" + sheet.getLastRow()).createTextFinder(email).findAll();
      
        // 2. Create an object for using with Sheets API.
        const reqs = ranges.reduce((o, e) => {
          const row = e.getRow();
          o.rows.push(row);
          o.ranges.push("A" + row);
          return o;
        }, {rows: [], ranges: []});
      
        // 3. Retrieve values and add the row number.
        const res = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: reqs.ranges})
          .valueRanges
          .map((e, i) => ([reqs.rows[i], e.values[0][0]]));
      
        Logger.log(res)
        return res;
      }