indexOf返回-1,尽管对象在数组中-谷歌电子表格脚本中的Javascript

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 =

我正在为GoogleDocs电子表格编写一个脚本,以读取一个董事列表,并将他们添加到一个数组中,如果他们还没有出现在其中的话

但是,对于数组中包含的元素,我似乎无法让indexOf返回除-1之外的任何内容

谁能告诉我我做错了什么?或者告诉我一个更简单的方法

这是我的剧本:

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