Что же такое массив? Массив это таблица значений, состоящая из строк и столбцов. То есть по сути лист 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] элемент массива
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!
а вы сталкивались с тем, что при записи пользовательской функии только два первых аргумента воспринимаются как массивы?
пример:
=FIFOART( B14:B18; C14:C18; E14;F14;G14;0)
Добрый день, да, действительно есть такой момент, в случае, если идет просто ссылка на ячейку или вообще хардовое значение (как в вашем примере — последний аргумент = 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)
}
т.е. я пробегаюсь по всему полученному объекту и если значение ключа не объект — пушу его в массив с доп квадратными скобками. Если же это ‘объект’ (в данном случае массив) — то пушу как есть, квадратные скобки не нужны.
Непросто переучиваться с VBA.
Вместо arr[0][0], рука «сама» пишет arr[0,0], глаз не замечает, javaScript пох.
Мне наоборот было проще переучиваться — более просто и логично всё.