Массивы в гугл скриптах: азы

Что же такое массив? Массив это таблица значений, состоящая из строк и столбцов. То есть по сути лист Google Sheets с какой-либо информацией это и есть массив.

однако это массив на листе.

Нам же интересна возможность работы с массивом в скриптах.

ПОЛУЧЕНИЕ МАССИВА

Здесь все стандартно. Сначала получаем книгу, потом лист, потом необходимый диапазон на листе и потом уже (вот это сначала непривычно и несколько обескураживает) — значения в этом диапазоне

function arrayActions() {

const ss = SpreadsheetApp.getActiveSpreadsheet(); // получаем активную книгу

const ws = ss.getSheetByName('Array'); // получаем лист по указанному имени

const myArray = ws.getDataRange().getValues(); // получаем диапазон значений и сами значения в этом диапазоне

return myArray; //вернем массив как результат выполнения функции (понадобится в дальнейшем)

Logger.log(myArray); // выводим диапазон значений в логгер (консоль)

}

Результат Логгера — массив массивов:

[[Имя, Фамилия, Возраст], [Гена, Крокодил, 37.0], [Дмитрий, Ржевский, 20.0], [Кристофер, Робин, 14.0], [Ослик, Иа, 18.0], [Винни, Пух, 44.0], [Джон, Константин, 35.0]]

Пошагово

Я мучился вопросом зачем надо вот это:

const ss = SpreadsheetApp.getActiveSpreadsheet();

Ведь я и так уже в приложении Google Sheets (SpreadsheetApp) и в текущей книге ( getActiveSpreadsheet())

Но ведь из книги можно получить доступ и к почте и к календарю, а значит редактору надо буквально объяснять что именно присваивается переменной.

Способы получения данных

Вообще, получать значения можно несколькими способами, но основных всего 2:

const myArray = ws.getDataRange().getValues();

и

const myArray = ws.getRange(1,1, ws.getLastRow(), ws.getLastColumn()).getValues();

где: (1— номер строки с какой начинается «захват»,1 — номер столбца с какой начинается «захват», ws.getLastRow() — последняя строка с какими либо данными, ws.getLastColumn() — последний столбец с какими-либо данными)

Допустим мы не хотим захватывать шапку [Имя, Фамилия, Возраст]. Тогда начинать стоит со второй строки:

const myArray = ws.getRange(2,1, ws.getLastRow(), ws.getLastColumn()).getValues();

в этом как раз основное отличие от getDataRange(), потому что он по сути берет «всё, что видит»

Если же нам нужен какой-то определенный кусок таблицы, а не вся она то, соответственно:

const myArray = ws.getRange(1,1, номер строки ВКЛЮЧИТЕЛЬНО, номер столбца ВКЛЮЧИТЕЛЬНО).getValues();

Элементы массива

Если совсем просто, то вот это — [Джон, Константин, 35.0] — массив, он обозначается квадратными скобками [] и в нем «Джон» это первый элемент массива, «Константин» — второй, 35.0 — третий.

Обратиться к элементу массива можно следующим образом:

myArray[0] //вернет текстовое значение "Джон"

myArray[1] //вернет текстовое значение "Константин"

myArray[2] //вернет число 35.0

А вот это — [[Джон, Константин, 35.0]] — массив в массиве, где [Джон, Константин, 35.0] — первый [0] элемент массива


Ваше мнение важно и может улучшить блог

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

У этой записи 4 комментариев

  1. Юрий

    а вы сталкивались с тем, что при записи пользовательской функии только два первых аргумента воспринимаются как массивы?
    пример:

    =FIFOART( B14:B18; C14:C18; E14;F14;G14;0)

    1. Добрый день, да, действительно есть такой момент, в случае, если идет просто ссылка на ячейку или вообще хардовое значение (как в вашем примере — последний аргумент = 0), то гуглошиты воспринимают их как есть, то есть что это по сути (0 — number).

      Чтобы ваша кастом-функция делала из 0 массив с одним элементом [0] можно сделать следующим образом:

      function fifoart(a,b,c,d,e,f) {
      const obj ={
      first: a,
      second: b,
      third: c,
      foth: d,
      fifth: e,
      sixth: f
      }

      const arr = []

      for (let elem in obj){

      if(typeof obj[elem] != ‘object’){
      arr.push([obj[elem]])
      } else {
      arr.push(obj[elem])
      }

      }

      console.log(arr)
      }
      т.е. я пробегаюсь по всему полученному объекту и если значение ключа не объект — пушу его в массив с доп квадратными скобками. Если же это ‘объект’ (в данном случае массив) — то пушу как есть, квадратные скобки не нужны.

  2. Непросто переучиваться с VBA.
    Вместо arr[0][0], рука «сама» пишет arr[0,0], глаз не замечает, javaScript пох.

    1. Мне наоборот было проще переучиваться — более просто и логично всё.

Добавить комментарий