indexOf返回-1尽管对象在数组中 - Google Spreadsheet Scripts中的Javascript

thr*_*mon 8 javascript arrays indexof google-sheets google-apps-script

我正在为Google Docs Spreadsheet编写一个脚本来读取导演列表,如果它们尚未出现在阵列中,则将它们添加到阵列中.

但是,对于包含在数组中的元素,我似乎无法使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]);
}
};
Run Code Online (Sandbox Code Playgroud)

Ada*_*amL 5

当您使用getValues()检索Google Apps脚本中的值时,您将始终处理2D Javascript数组(按行然后列编制索引),即使相关范围是一列宽.所以在您的特定情况下,以及扩展+ RobG的示例,您的values数组实际上看起来像这样:

[['fred'], ['sam'], ['sam'], ['fred']]

所以你需要改变

var row = values[i];
Run Code Online (Sandbox Code Playgroud)

var row = values[i][0];
Run Code Online (Sandbox Code Playgroud)

另外,值得注意的是,您可以使用Sheets原生的电子表格函数来实现此功能(直接键入电子表格单元格):

=UNIQUE(Director)

这将在命名范围内容Director发生变化时动态更新.话虽如此,您可能有充分的理由想要使用Google Apps脚本.