Javascript/Google Apps 脚本索引问题
Javascript/Google Apps Script IndexOf issues
这里有几个关于 IndexOf 函数的类似查询,但我会伸出援手,因为虽然提供的答案很有帮助,但 none 已经解决了问题。
我有一个(非常)大的二维数组,来自名称与 ID 代码的扩展sheet。我将应用程序脚本中的这些值读入数组(下面代码段中的rIdr
)。
然后我构建 2x 一维数组,以便我可以使用 IndexOf 在第一个数组中搜索名称,然后使用 returned 索引从第二个数组中提取值。
var keys=[]; var vals=[];
//build key-val lookup arrays
for (var i = 0; i < rIdr.values.length; i++){
var k = rIdr.values[i][0].toString()
keys[i]=k
var v = rIdr.values[i][1].toString()
vals[i]=k
}
我要查找的名称是从其他地方填充的 JSON 中获得的。我遍历此对象中的名称,在我的 key
和 val
数组中查找它们:
jsonobj.data.forEach(function(value) {
var idx = keys.indexOf(value.first_names_txt + " " + value.last_name_txt)
var id = -1;
if (idx > -1){id = vals[idx]}
Logger.log(value.first_names_txt + " " + value.last_name_txt + " " + id)
});
我已经验证了我从 JSON 对象中提取的名称以及键数组的元素都是字符串类型。我在对象检查器中看到键数组是一个字符串数组(例如,不是数组对象数组)。
尽我所能,我无法将 IndexOf 设为 return 除了 -1 以外的任何值。
即使我明确地寻找一个我知道在那里的名字(实际上是名字的复制粘贴,因为它写在我从中提取值的 sheet 上),我仍然得到 -1 return编辑
var test
test = keys.indexOf("Joe Bloggs")
我在这里撕破了头发。我不想编写一个单独的函数来匹配键数组中的名称,因为我要么需要将完整的 keys
数组作为参数传递,要么将其设为全局变量——两者都不是出于各种原因我想做。
任何人都可以帮助解决为什么 IndexOf 在这里不起作用?
如果这是一个不会消失的问题,有没有办法编写我自己的搜索函数来避免传递大数组或将它们声明为全局变量?
提前致谢
描述
我使用 json 数据文件中的名称构建了一个 spreadsheet sheet,随机化这些名称,使它们不再按字母顺序排列,然后分配了一个 id每个的编号。
我提供的示例脚本列出了 json 数据文件中名称的 ID 号。请注意,我正在使用原始数据数组。我不需要创建键值数组来获得我想要的结果。而且我不检查名称是否不存在于数据数组中。
为简洁起见,我截断了 json 数据
Code.gs
function test_json() {
try {
let jdata = {
"type" : "entrants",
"data" : [ {
"type" : "entrant",
"id" : "en_tdgwjajthr",
"first_names_txt" : "Archie",
"last_name_txt" : "White",
"entrytype" : "et_dv8u152j",
"answers" : {
"q_wg5qq6bgvsy90rh" : "Partenza Nude-Espresso RT"
}
}, {
.
.
.
.
}, {
"type" : "entrant",
"id" : "en_8uhauoe3jo",
"first_names_txt" : "Valentijn",
"last_name_txt" : "Brax",
"entrytype" : "et_dv8u152j",
"answers" : {
"q_wg5qq6bgvsy90rh" : "Dulwich Paragon CC"
}
} ],
"has_more_bool" : false
};
let values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getDataRange().getValues();
jdata.data.forEach(function(value){
let key = value.first_names_txt+" "+value.last_name_txt;
let found = values.find( row => row[0] === key );
console.log("key = "+key+" id = "+found[1]);
});
}
catch(err) {
console.log(err)
}
}
执行日志(略)
10:29:05 AM Notice Execution started
10:29:06 AM Info key = Archie White id = 21
10:29:06 AM Info key = ari panzer id = 15
10:29:06 AM Info key = Daniel Mulcahy id = 5
10:29:06 AM Info key = David Streule id = 12
10:29:06 AM Info key = Dominic Bell id = 10
10:29:06 AM Info key = Euan Davies id = 14
这里有几个关于 IndexOf 函数的类似查询,但我会伸出援手,因为虽然提供的答案很有帮助,但 none 已经解决了问题。
我有一个(非常)大的二维数组,来自名称与 ID 代码的扩展sheet。我将应用程序脚本中的这些值读入数组(下面代码段中的rIdr
)。
然后我构建 2x 一维数组,以便我可以使用 IndexOf 在第一个数组中搜索名称,然后使用 returned 索引从第二个数组中提取值。
var keys=[]; var vals=[];
//build key-val lookup arrays
for (var i = 0; i < rIdr.values.length; i++){
var k = rIdr.values[i][0].toString()
keys[i]=k
var v = rIdr.values[i][1].toString()
vals[i]=k
}
我要查找的名称是从其他地方填充的 JSON 中获得的。我遍历此对象中的名称,在我的 key
和 val
数组中查找它们:
jsonobj.data.forEach(function(value) {
var idx = keys.indexOf(value.first_names_txt + " " + value.last_name_txt)
var id = -1;
if (idx > -1){id = vals[idx]}
Logger.log(value.first_names_txt + " " + value.last_name_txt + " " + id)
});
我已经验证了我从 JSON 对象中提取的名称以及键数组的元素都是字符串类型。我在对象检查器中看到键数组是一个字符串数组(例如,不是数组对象数组)。
尽我所能,我无法将 IndexOf 设为 return 除了 -1 以外的任何值。 即使我明确地寻找一个我知道在那里的名字(实际上是名字的复制粘贴,因为它写在我从中提取值的 sheet 上),我仍然得到 -1 return编辑
var test
test = keys.indexOf("Joe Bloggs")
我在这里撕破了头发。我不想编写一个单独的函数来匹配键数组中的名称,因为我要么需要将完整的 keys
数组作为参数传递,要么将其设为全局变量——两者都不是出于各种原因我想做。
任何人都可以帮助解决为什么 IndexOf 在这里不起作用?
如果这是一个不会消失的问题,有没有办法编写我自己的搜索函数来避免传递大数组或将它们声明为全局变量?
提前致谢
描述
我使用 json 数据文件中的名称构建了一个 spreadsheet sheet,随机化这些名称,使它们不再按字母顺序排列,然后分配了一个 id每个的编号。
我提供的示例脚本列出了 json 数据文件中名称的 ID 号。请注意,我正在使用原始数据数组。我不需要创建键值数组来获得我想要的结果。而且我不检查名称是否不存在于数据数组中。
为简洁起见,我截断了 json 数据
Code.gs
function test_json() {
try {
let jdata = {
"type" : "entrants",
"data" : [ {
"type" : "entrant",
"id" : "en_tdgwjajthr",
"first_names_txt" : "Archie",
"last_name_txt" : "White",
"entrytype" : "et_dv8u152j",
"answers" : {
"q_wg5qq6bgvsy90rh" : "Partenza Nude-Espresso RT"
}
}, {
.
.
.
.
}, {
"type" : "entrant",
"id" : "en_8uhauoe3jo",
"first_names_txt" : "Valentijn",
"last_name_txt" : "Brax",
"entrytype" : "et_dv8u152j",
"answers" : {
"q_wg5qq6bgvsy90rh" : "Dulwich Paragon CC"
}
} ],
"has_more_bool" : false
};
let values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getDataRange().getValues();
jdata.data.forEach(function(value){
let key = value.first_names_txt+" "+value.last_name_txt;
let found = values.find( row => row[0] === key );
console.log("key = "+key+" id = "+found[1]);
});
}
catch(err) {
console.log(err)
}
}
执行日志(略)
10:29:05 AM Notice Execution started
10:29:06 AM Info key = Archie White id = 21
10:29:06 AM Info key = ari panzer id = 15
10:29:06 AM Info key = Daniel Mulcahy id = 5
10:29:06 AM Info key = David Streule id = 12
10:29:06 AM Info key = Dominic Bell id = 10
10:29:06 AM Info key = Euan Davies id = 14