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]);
参考: