Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 谷歌应用程序脚本获取多个索引位置

Javascript 谷歌应用程序脚本获取多个索引位置,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我试图找出一种方法来获得字符串每次重复的索引位置 目标是获得每个索引位置,并使用每个位置之间的差异创建小计。目前的问题有两个方面。首先,每个字符串之间的距离不是标准长度。其次,我似乎无法找到如何获取特定字符串的多个索引位置。我目前正在使用下面的代码在不同的范围内循环,以便在工作表中插入方程 var Architecture = function(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = ss.getA

我试图找出一种方法来获得字符串每次重复的索引位置

目标是获得每个索引位置,并使用每个位置之间的差异创建小计。目前的问题有两个方面。首先,每个字符串之间的距离不是标准长度。其次,我似乎无法找到如何获取特定字符串的多个索引位置。我目前正在使用下面的代码在不同的范围内循环,以便在工作表中插入方程

var Architecture = function(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var data = activeSheet.getRange(18, 2, 7, activeSheet.getLastColumn()).getValues();

  for (var i = 0; i < data.length; i++){

    var rowData = data[i];
    var checkData = data;
    var row = checkData[i];
    var colB = row[0]; 

    if(colB == 'Subtotal'){

      activeSheet.getRange(18 + i, 5, 1, data[0].length-4).setFormula('=iferror(sum(E' + (i+12) + ':E' + (i+17) + '))');
    }else{
      activeSheet.getRange(18 + i, 5).setFormula('=iferror(sum(F' + (i+18) + ':DU' + (i+18) + '))');
      activeSheet.getRange(18 + i, 6)
      .setFormula('=iferror(sum(filter(Invoices!$E:$E,Year(Invoices!$B:$B)=year(F$12),MONTH(Invoices!$B:$B)=Month(F$12),Invoices!$F:$F=$B' + (i+18) + ',Invoices!$A:$A=$C$2)))')
      .copyTo(activeSheet.getRange('F18:DU23'));
    }
  }
};

var DueDiligence = function(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var data = activeSheet.getRange(26, 2, 15, activeSheet.getLastColumn()).getValues();

  for (var i = 0; i < data.length; i++){

    var rowData = data[i];
    var checkData = data;
    var row = checkData[i];
    var colB = row[0]; 

    if(colB == 'Subtotal'){

 activeSheet.getRange(26 + i, 5, 1, data[0].length-4).setFormula('=iferror(sum(E' + (i+12) + ':E' + (i+25) + '))');
    }else{
      activeSheet.getRange(26 + i, 5).setFormula('=iferror(sum(F' + (i+26) + ':DU' + (i+26) + '))');
      activeSheet.getRange(26 + i, 6)
      .setFormula('=iferror(sum(filter(Invoices!$E:$E,Year(Invoices!$B:$B)=year(F$12),MONTH(Invoices!$B:$B)=Month(F$12),Invoices!$F:$F=$B' + (i+26) + ',Invoices!$A:$A=$C$2)))')
      .copyTo(activeSheet.getRange('F26:DU39'));
    }
  }
};
var架构=函数(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var-activeSheet=ss.getActiveSheet();
var data=activeSheet.getRange(18,2,7,activeSheet.getLastColumn()).getValues();
对于(变量i=0;i
我们的目标是将所有这些不同的函数合并到一个数组中,该数组的运行速度要比当前运行所需的18秒快得多

编辑

我取得了一些进展。使用下面的函数,我可以获得每个字符串的索引,但它会在日志中重复该索引位置,以获得前面的行数。例如,如果字符串位于索引位置2,然后是索引位置10,则日志显示2,2,2,10,10,10,10,10,10(因为10-2=8,所以只有八个位置)

var测试=函数(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var-activeSheet=ss.getActiveSheet();
var data=activeSheet.getRange(14,2,activeSheet.getLastRow()-13,1.getValues();
var newData=data.map(函数(r){返回r[0];});
//Logger.log(newData);
//Logger.log(data.indexOf(“小计”[i]);
对于(变量i=0;i
以下是一个示例:

function getRowNumbersOfSameStrings() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getRange(2,1,sh.getLastRow()-1,1);
  const vs=rg.getValues();
  let u={};
  vs.forEach(function(r,i){
    if(!u.hasOwnProperty(r[0])) {
      u[r[0]]=[];
      u[r[0]].push(i+2);//row numbers
    }else{
      u[r[0]].push(i+2);//row numbers
    }
  });
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(JSON.stringify(u)), "Results");
}
以下是我的示例数据:

COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8
7,2,4,0,1,1,10,4
9,3,2,5,2,6,7,6
9,2,10,10,9,7,2,11
10,7,2,10,2,6,2,0
0,2,4,0,6,3,10,0
2,7,6,7,0,3,5,8
6,9,6,11,3,5,5,8
1,4,5,5,10,0,3,11
4,3,3,3,1,9,3,2
9,4,0,9,2,8,11,2
5,8,7,0,3,6,5,4
5,3,5,3,2,3,8,3
结果:

{"0":[6],"1":[9],"2":[7],"4":[10],"5":[12,13],"6":[8],"7":[2],"9":[3,4,11],"10":[5]}
下面是一个例子:

function getRowNumbersOfSameStrings() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getRange(2,1,sh.getLastRow()-1,1);
  const vs=rg.getValues();
  let u={};
  vs.forEach(function(r,i){
    if(!u.hasOwnProperty(r[0])) {
      u[r[0]]=[];
      u[r[0]].push(i+2);//row numbers
    }else{
      u[r[0]].push(i+2);//row numbers
    }
  });
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(JSON.stringify(u)), "Results");
}
以下是我的示例数据:

COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8
7,2,4,0,1,1,10,4
9,3,2,5,2,6,7,6
9,2,10,10,9,7,2,11
10,7,2,10,2,6,2,0
0,2,4,0,6,3,10,0
2,7,6,7,0,3,5,8
6,9,6,11,3,5,5,8
1,4,5,5,10,0,3,11
4,3,3,3,1,9,3,2
9,4,0,9,2,8,11,2
5,8,7,0,3,6,5,4
5,3,5,3,2,3,8,3
结果:

{"0":[6],"1":[9],"2":[7],"4":[10],"5":[12,13],"6":[8],"7":[2],"9":[3,4,11],"10":[5]}

您希望检索名为
“Subtotal”
的数组中所有元素的索引

这可以通过组合和在一行中完成:

var index=newData.map((元素,i)=>element==“小计”?i:)
.filter(元素=>元素!==“”);
在本例中,map返回一个包含匹配索引和空字符串(用于不匹配索引)的数组,filter将删除空字符串元素

编辑: 如果要检索索引与上一个索引之间存在差异的数组,可以这样做(在本例中,第一个索引将相同):

var差异=索引.map((元素,i)=>i==0?元素:元素-索引[i-1]);
参考:

您希望检索名为
“Subtotal”
的数组中所有元素的索引

这可以通过组合和在一行中完成:

var index=newData.map((元素,i)=>element==“小计”?i:)
.filter(元素=>元素!==“”);
在本例中,map返回一个包含匹配索引和空字符串(用于不匹配索引)的数组,filter将删除空字符串元素

编辑: 如果要检索索引与上一个索引之间存在差异的数组,可以这样做(在本例中,第一个索引将相同):

var差异=索引.map((元素,i)=>i==0?元素:元素-索引[i-1]);
参考:

要获取数据中索引位置的字符串在哪里?好的,这是第2列。我会让每个唯一的字符串成为一个对象的属性,该对象包含一个索引数组。有很多方法可以做到这一点。我可能会使用reduce,但这取决于你。我对这个相当陌生,以前从未使用过对象。您能否解释一下它是如何工作的,以及如何设置它来保存一个索引数组?或者我从循环indexOf函数传递的那些索引?要获取数据中索引位置的字符串在哪里?好的,这是第2列。我会让每个唯一的字符串成为一个对象的属性,该对象包含一个索引数组。有很多方法可以做到这一点。我可能会使用reduce,但这取决于你。我对这个相当陌生,以前从未使用过对象。您能否解释一下它是如何工作的,以及如何设置它来保存一个索引数组?或者我从函数的循环索引传递的索引