【问题标题】:Google script indexOf not working for custom element谷歌脚本 indexOf 不适用于自定义元素
【发布时间】:2018-12-01 20:01:26
【问题描述】:

这是我在谷歌表中的脚本示例。如何设置 indexOf 方法在所有情况下都有效?

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MySheet");
var myArray = sheet.getRange("A7:A10").getValues();

//this works (of course) -> returns 2
sheet.getRange('L1').setValue(myArray.indexOf(myArray[2]));

//this don't work (but it can be my fault in typing..) -> returns -1
sheet.getRange('L2').setValue(myArray.indexOf("Thing"));

//this don't work (why?) -> returns -1
sheet.getRange('L3').setValue(myArray.indexOf(sheet.getRange("A9").getValues()));

//to check my value, this works
Browser.msgBox(myArray[2]);

我哪里错了?单元格中的所有内容都是字符串。

【问题讨论】:

  • @Cooper 谢谢,但它仍然返回 -1。
  • @TheMaster 你知道我该如何使用它吗?

标签: javascript google-apps-script google-sheets indexof


【解决方案1】:

getValues() 返回一个数组数组(也称为二维数组)。

所以基本上,如果您有一张填充有数据的工作表,如下所示:

+---+------+----+--------+
|   |  A   | B  |   C    |
+---+------+----+--------+
| 1 | John |    | Doe    |
| 2 | Jane |    | Doe    |
| 3 | John | Q. | Public |
+---+------+----+--------+

调用getValues() 会给你一个像这样的二维数组:

var myArray = sheet.getRange('A1:C3').getValues();

Logger.log(myArray);

/* Logger output will look something like this:
[
    ["John", null, "Doe"],
    ["Jane", null, "Doe"],
    ["John", "Q.", "Public"]
]
*/

回到你的工作表,myArray.indexOf("Thing")正在尝试将字符串对象“Thing”与数组对象进行匹配;这将始终导致-1。您需要重构代码以考虑二维数组。

【讨论】:

  • 谢谢你的回答,但在我的情况下,范围只有一列,所以我希望用一维对象来处理字符串(并且这个条件在我的代码中永远不会改变):那么我该如何解决我的情况并使用 indexOf (或者可以对另一种方法提出建议)?
  • @marcoresk 即使只有一列,您也会得到一个数组数组。使用Logger.log() 记录您的myArray 变量,您会看到它是一个二维数组。一旦您调整了代码以考虑到这一点,您就可以开始了。
  • @marcoresk 另一件事,getValues() always 返回一个 2D 数组。您可以通过checking the documentation 验证这一点。
【解决方案2】:

我玩弄了这个,我终于意识到我需要将数据转换回一维数组。这是我正在玩的代码。它与你的不完全一样,但它做了类似的事情。

function test() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  sh.getRange('A1:D5').clear();
  sh.getRange('A1:A5').setValues([["One"],["Twp"],["Three"],["Four"],["Five"]]);//just intializing my data
  var mA = sh.getRange("A1:A5").getValues();
  var dA=[];
  for(var i=0;i<mA.length;i++){
    sh.getRange(i+1,2).setValue(mA[i][0]);
    dA.push(mA[i][0]);
    sh.getRange(i+1,3).setValue(dA.indexOf(mA[i][0]));
    sh.getRange(i+1,4).setValue(dA.indexOf(sh.getRange(i+1,2).getValue()));
  }
}

因此您可以将其添加到您的代码中以使其正常工作。

var myArray = sheet.getRange("A7:A10").getValues();
  var mA=[];
  for(var i=0;myArray.length;i++){
    mA.push(myArray[i][0]);
  }

然后用mA.indexOf()代替myArray.indexOf();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2022-11-06
    • 1970-01-01
    • 2014-09-05
    • 2022-07-28
    • 1970-01-01
    相关资源
    最近更新 更多