Почему Google скрипт для каждого запускается по-разному для диапазона в строке и диапазона в столбце - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь создать список вкладок на основе значений в строке, как я ранее делал со значениями в столбце (Скрипт здесь - это пример теста, когда я пытался определить проблему, а не фактический скрипт используемый). Однако функция forEach() работает по-другому, и я не понимаю, почему. Ниже я добавлю два набора сценариев и их результаты.

Для столбца :

  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(1,1,5,1);
  var STlist = [];

  range.getValues().forEach(function(x){
    Logger.log(x + " why");
    STlist.push(x);
  });

  Logger.log(STlist);  
}

Вывод для столбца

[20-02-28 12:10:58:012 HKT] z why
[20-02-28 12:10:58:018 HKT] a why
[20-02-28 12:10:58:021 HKT] b why
[20-02-28 12:10:58:023 HKT] c why
[20-02-28 12:10:58:026 HKT] d why
[20-02-28 12:10:58:029 HKT] [[z], [a], [b], [c], [d]]

Для строки

  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(1,1,1,5);
  var STlist = [];

  range.getValues().forEach(function(x){
    Logger.log(x + " why");
    STlist.push(x);
  });

  Logger.log(STlist);  
}

Вывод для строки

[20-02-28 12:11:35:013 HKT] z,x,d,v,g why
[20-02-28 12:11:35:018 HKT] [[z, x, d, v, g]]

Возможно ли, чтобы формат строки работал такой же как формат столбца? Как я ожидал увидеть те же результаты, но я получил другие результаты.

Спасибо

1 Ответ

2 голосов
/ 28 февраля 2020

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

range.getValues().forEach(function(x){

x будет строкой. И строка будет массивом с элементами столбца:

A1: A5: [[z], [a], [b], [c], [d]]
A1: E1: [[z, x, d, v, g]]

A1: A5 имеет 5 строк и каждая из этих строк содержит элемент столбца. Таким образом, forEach(row=>) будет повторять 5 строк. A1: E1 содержит 1 строку и, следовательно, forEach(row=>) будет повторять 1 строку. Чтобы перебрать элементы в каждой строке, вам понадобится другой for-l oop:

const arr1 = [["a1","b1"]];
const arr2 = [["a1"],["a2"]];
const arr3 = [["a1","b1"],
                   ["a2","b2"]];
const st = JSON.stringify
const loop_ = (arr) => 
  arr.forEach((row, i) => 
    row.forEach((colEl, j) => 
      console.info(`This array is ${st(arr)} 
            row is ${st(row)} 
            Current column is ${st(colEl)}
            col Element at index [${i},${j}] in this array is ${colEl}`)));

[arr1,arr2,arr3].forEach(loop_)

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...