indexOf返回-1,尽管对象在数组中-谷歌电子表格脚本中的Javascript
我正在为GoogleDocs电子表格编写一个脚本,以读取一个董事列表,并将他们添加到一个数组中,如果他们还没有出现在其中的话 但是,对于数组中包含的元素,我似乎无法让indexOf返回除-1之外的任何内容 谁能告诉我我做错了什么?或者告诉我一个更简单的方法 这是我的剧本:indexOf返回-1,尽管对象在数组中-谷歌电子表格脚本中的Javascript,javascript,arrays,google-apps-script,google-sheets,indexof,Javascript,Arrays,Google Apps Script,Google Sheets,Indexof,我正在为GoogleDocs电子表格编写一个脚本,以读取一个董事列表,并将他们添加到一个数组中,如果他们还没有出现在其中的话 但是,对于数组中包含的元素,我似乎无法让indexOf返回除-1之外的任何内容 谁能告诉我我做错了什么?或者告诉我一个更简单的方法 这是我的剧本: function readRows() { var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director"); var values =
function readRows() {
var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director");
var values = column.getValues();
var numRows = column.getNumRows();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var directors = new Array();
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (directors.indexOf(row) == -1) {
directors.push(row);
} else {
directors.splice(directors.indexOf(row), 1, row);
}
}
for (var i = 2; i < directors.length; i++) {
var cell = sheet.getRange("F" + [i]);
cell.setValue(directors[i]);
}
};
函数readRows(){
var column=SpreadsheetApp.getActiveSpreadsheet().getRangeByName(“主管”);
var values=column.getValues();
var numRows=column.getNumRows();
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheets()[0];
var directors=新数组();
对于(var i=0;i当您使用在Google Apps脚本中检索值时,您将始终处理一个2D Javascript数组(按行索引,然后按列索引),即使所涉及的范围是一列宽。因此,在您的特定情况下,并扩展+RobG的示例,您的值
数组实际上将如下所示:
[['fred'],['sam'],['sam'],['fred']]
所以你需要改变
var row = values[i];
到
另一方面,可能值得注意的是,您可以使用工作表固有的电子表格功能来实现这一点(直接输入到电子表格单元格中):
=唯一(控制器)
这将随着名为Director
的范围的内容的更改而动态更新。也就是说,您可能有一个很好的理由希望为此使用Google Apps脚本。我在将范围作为对象的电子表格函数中遇到了类似的问题。在我的情况下,我想对固定值集(在另一个数组中)
问题是,“column”变量不包含列——它包含一个2D数组。因此,每个值都是它自己的行(本身就是一个数组)
我知道我可以使用电子表格中的现有函数完成以下示例,但这是一个处理2D数组以搜索值的不错的演示:
function flatten(range) {
var results = [];
var row, column;
for(row = 0; row < range.length; row++) {
for(column = 0; column < range[row].length; column++) {
results.push(range[row][column]);
}
}
return results;
}
function getIndex(range, value) {
return flatten(range).indexOf(value);
}
函数展平(范围){
var结果=[];
var行、列;
用于(行=0;行
因此,由于我只想搜索整个范围内是否存在某个值,所以我将其展平为一个数组。如果您真的要处理二维范围,那么这种展平和获取索引的方式可能没有多大用处。在我的例子中,我通过一列查找两个集合的交点。听起来像GAS而不是JS的问题。我在使用getValues()时总是遇到问题。即使是,你也不能像你期望的那样与它进行比较。尽管如果你使用像values[0][1]
这样的索引语句,你会得到一个基本的数据类型。解决方案(我希望有更好的方法)就是将该对象强制放入一个字符串(),然后拆分()将其重新放入一个可以使用的数组中
以下是我将使用的代码:
var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director");
var values = column.getValues();
values = String(values).split(",");
var myIndex = values.indexOf(myDirector);
如果myDirector在值中,您将得到一个数字!=-1。但是,数据中的逗号将导致问题。这仅适用于1D数组
在您的情况下:var row=values[i];
row是一个对象,而不是您要比较的字符串。将所有值转换为与上面类似的数组,您的比较运算符应该可以工作。(尝试将row打印到控制台,查看它的内容:Logger.log(row)
)如果有人遇到这篇文章,你可能会考虑使用下面的库。它看起来对我有用。我甚至在尝试例子的时候也得到了‘1’的回报(谢谢你的建议!)
在添加数组库(版本13)并使用find()函数之后,我得到了正确的行
这是我使用的项目密钥:MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK\T
参考文献:
希望这对其他人也有帮助。因为我们使用的是2D数组,2dArray.indexOf(“搜索词”)
必须有一个完整的1D数组作为搜索词。如果我们要在该数组中搜索单个单元格值,我们必须指定要查找的行
这意味着如果搜索项不是数组,则使用2dArray[0].indexOf(“搜索项”)
。这样做指定要查找数组中的第一行
如果我们查看3x3单元格范围,并且希望搜索第三行,我们将使用2dArray[2].indexOf(“搜索词”)
下面的脚本获取电子表格中的当前行并将其转换为数组。然后使用indexOf()
方法在该行中搜索“搜索词”
我也遇到了类似的问题。getValues()似乎就是问题所在。所有其他方法都给了我一个indexOf=-1
我使用了split方法,并对创建的新数组执行了indexOf。它很有效
var col_index = 1;
var indents_column = main_db.getRange(1,col_index,main_db.getLastRow(),1).getValues();
var values = String(indents_column).split(","); // flattening the getValues() result
var indent_row_in_main_db = values.indexOf(indent_to_edit) + 1; // this worked
else块似乎是多余的。它将行替换为行。我还要补充的是,可以更有效地进行值的“设置”,即在循环中使用setValues()而不是setValues()。但我不想让我的答案太复杂。如果您无法解决如何进行此操作(或在本论坛上找到解决此问题的问答),您可能想发布一个新问题。
//This function puts the specified row into an array.
//var getRowAsArray = function(theRow)
function getRowAsArray()
{
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the current spreadsheet
var theSheet = ss.getActiveSheet(); // Get the current working sheet
var theRow = getCurrentRow(); // Get the row to be exported
var theLastColumn = theSheet.getLastColumn(); //Find the last column in the sheet.
var dataRange = theSheet.getRange(theRow, 1, 1, theLastColumn); //Select the range
var data = dataRange.getValues(); //Put the whole range into an array
Logger.log(data); //Put the data into the log for checking
Logger.log(data[0].indexOf("Search Term")); //2D array so it's necessary to specify which 1D array you want to search in.
//We are only working with one row so we specify the first array value,
//which contains all the data from our row
}
var col_index = 1;
var indents_column = main_db.getRange(1,col_index,main_db.getLastRow(),1).getValues();
var values = String(indents_column).split(","); // flattening the getValues() result
var indent_row_in_main_db = values.indexOf(indent_to_edit) + 1; // this worked