在谷歌脚本中,我写了一些东西来检查我的每月费用,这些费用列在Google工作表中。 根据脚本找到的单词,每行都会获得一个类别标记。它工作正常,但要搜索的单词数量越来越多。阵列也变大了。
我列出了6对(要查找的单词,要添加的标记) - 但在实际版本中我有多达35个。如何创建对,并在数组中自动加载所有内容?
这是我的剧本:
function myFunction() {
// check usual suspects
var A1 = ["CAFE", "HORECA"]
var A2 = ["ALBERT", "AH"]
var A3 = ["VOMAR","Vomar"]
var A4 = ["HEMA","HEMA"]
var A5 = ["KRUID","Drogist"]
var A6 = ["RESTA", "Horeca"]
// in Array
var expenses = [A1,A2,A3,A4,A5,A6]
var ss = SpreadsheetApp.getActiveSheet();
var data = ss.getDataRange().getValues(); // read all data in the sheet
for (i in expenses)
{for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
if(data[n][3].toString().toUpperCase().match(expenses[i][0])==expenses[i][0]){ data[n][4] = expenses[i][1]};
// if column D contains 'xyz' then set value in index [5] (is column E)
}
Logger.log(data)
ss.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
}
答案 0 :(得分:4)
我可以建议你:
function multiPass(){
var searchCriterions = [
["CAFE","HORECA" ],
["ALBERT", "AH"],
["VOMAR","Vomar"],
["HEMA","HEMA"]
];
var dico = {};
var patt = "";
for (var i in searchCriterions) {
dico[searchCriterions[i][0]] = searchCriterions[i][1];
patt += "("+searchCriterions[i][0]+")";
if((Number(i)+1)<searchCriterions.length){
patt += "|";
}
}
var re = new RegExp(patt,"");
var ss = SpreadsheetApp.getActiveSheet();
var data = ss.getDataRange().getValues(); // read all data in the sheet
Logger.log(re);
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
// THAT'S NOT COLUMN "A", 3 --> "D"
var test = data[n][3].toString().toUpperCase().match(re);
Logger.log(test);
if(test!==null){
data[n][4] = dico[test[0]]
};
}
ss.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
而不是为你的&#34;对使用变量&#34;喜欢使用大桌子(写起来不那么痛苦)
然后转换对象中的对,以快速访问该对的第二个参数,并创建一个大的正则表达式,立即检查所有关键字,而不是逐个解析它们。
现在我们正在使用一个大数组作为搜索标准,我们可以完全想象这个大数组被加载而不是硬编码。如果您有一张数据表,您可以这样更改代码:
var searchCriterions = SpreadsheetApp.getActive().getRange("namedRange").getValues();