我是个新手,没有太多经验。现在尝试用JS解决工作中的一些问题,我遇到了一个大麻烦。我尝试阅读一些建议的QA,但没有解决方案。我诚心诚意地寻求帮助,任何帮助都是非常感谢的。
html:
<script>
document.getElementById("autoin").addEventListener("input",doSearch);
function doSearch(){
var ai = document.getElementById("autoin").value;
google.script.run.withSuccessHandler(udAg).getAgent(ai);
}
function udAg(ag){
document.getElementById("agent").value = ag;
M.updateTextFields();
}
</script>google脚本:
function getAgent(ai){
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Updated");
var ctList = ws.getRange('A2:A17').getValues();
var position = ctList.indexOf(ai);
return position;
}它总是返回-1,即使我用直接字符串'ABC'替换了变量ai,这也是A2中的字符串。尝试同时返回ai和ctList[0],它们似乎是相同的,'ABC'。
console.log(ctList)显示[ [ 'ABC' ], [ 'CDE' ],[ 'EFG' ],... ]
我真的想不出解决办法,我真的需要麻烦大家来帮忙。谢谢。
发布于 2021-10-15 14:15:32
解释
它返回-1,因为您在包含子数组的数组上运行indexOf(),所以它不能匹配您的字符串。
例如,我可以将您的示例作为最小测试用例,并执行以下操作:
const array = [ [ 'ABC' ], [ 'CDE' ],[ 'EFG' ] ];
console.log(array.indexOf('ABC')); // -1显然,它返回-1,因为它在array变量中找不到匹配的"ABC"字符串:"ABC"包含在一个更深一层的子数组中。即它包含在array[0]中,特别是在array[0][0]中。
如果您阅读Array.indexOf()__的,您会注意到它将尝试查找与数组中的参数匹配的项。您正在由字符串数组组成的数组中查找字符串。
这就是为什么尝试查找ctList[0]会有效,因为它是身份匹配:
// returns -1 : correct string value, not an object equality, though
console.log(array.indexOf(['ABC']));
// returns 0: same object that's being looked up
console.log(array.indexOf(array[0]));解决方案
因此,从您的示例中很难知道您真正想要做的是什么,但是看起来您实际上想要查找包含字符串的数组的位置,而不是字符串的位置。如果是这种情况,并且每个子数组总是只有一个元素,那么这将适用于我的示例:
array.map(subarray => subarray[0]).indexOf('ABC'); // 0: YAY!或者对于你的情况:
ctList.map(subarray => subarray[0]).indexOf(ai);发布于 2021-10-15 14:21:19
尝试在getValues()之后添加flat():
function getAgent(ai) {
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Updated");
var ctList = ws.getRange('A2:A17').getValues().flat();//added flat
var position = ctList.indexOf(ai);
return position;
}即使是一行或一列返回为二维数组,索引也不能真正与二维数组一起工作。您可以通过其他方式和flat()做同样的事情,比如使用map。
发布于 2021-10-15 14:18:41
代码的这一部分位于脚本标记之外:
function getAgent(ai){
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Updated");
var ctList = ws.getRange('A2:A17').getValues();
var position = ctList.indexOf(ai);
return position;
}
...by方式-1是indexOf函数的正确值,也就是说,搜索值不是数组的一部分。
https://stackoverflow.com/questions/69586082
复制相似问题