Google скрипт indexOf не работает для пользовательского элемента - PullRequest
0 голосов
/ 01 декабря 2018

это пример моего скрипта в гугл листе.Как я могу настроить метод 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]);

Где я ошибаюсь?Все содержимое в ячейках является строкой.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я поэкспериментировал с этим и наконец понял, что мне нужно преобразовать данные обратно в одномерный массив.Это был код, с которым я играл.Это не совсем так, как у вас, но делает нечто подобное.

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();

0 голосов
/ 01 декабря 2018

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") пытается сопоставить строковый объект «Вещь» с объектом массива;это всегда приведет к -1.Вам необходимо провести рефакторинг своего кода, чтобы учесть двумерные массивы.

...