Как стать автором
Обновить

Комментарии 9

В интернете не было информации или хотя бы намека, как мы можем построчно записать данные в таблицу Google Sheets из массива используя Apps Script.

Я, конечно, мог не уловить какого-то нюанса в постановке задачи, но первый же результат поиска в гугле по запросу "add array as rows in google sheet apps script" выдаёт решение. Которое немного короче Вашего за счёт использования setValues для заполнения всей строки из массива сразу вместо дополнительного цикла и setValue для каждой ячейки отдельно.

И даже если бы гугл не выдал результат, и если не ограничиваться тем, что интернет это только гугл, то запрос в chatgpt тоже даёт отличный ответ на этот вопрос

если у вас объекты в массиве, то это не результативно. Нужен цикл, чтобы взять объект и значения свойств для записи в таблицу (insertRowBefore(beforePosition) - Вставляет строку перед заданной позицией строки.) Как вы будете задавать позицию без счетчика?

Вообще комментарий был исключительно про "в интернете не было даже намёка", что показалось мне настолько удивительным, что я аж 3 минуты потратил на гугление :)

Про циклы - у вас два цикла, один для строк, второй для ячеек внутри строки. Насколько я понял, без второго можно обойтись, в итоге сократив Вашу функцию как-то так (не тестировал):

const setValuesInTable = (arr, sheet, counter) => {
   sheet.getRange(counter + 2, 1, 1, arr.length).setValues([arr]);
}

P.S. На два комментария ниже подсказали ещё более правильный путь.

Как раз статья на то, чтобы разобраться новичку, есть документация. Но ни где прямого решения нет. Данная статья о том, как начинающему разработчику разобраться в данной теме.

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

Поправьте очепятку: поде́лится → подели́ться 

Во-первых, так писать в таблицу (поэлементно) - очень-очень неэффективно. Простейшая оптимизация - выкинуть функцию setValuesInTable и вместо неё писать sheet.appendRow(Object.values(arr[i])). Ещё более эффективно (если пренебречь параллельными вызовами функции) - добавлять в sortTasks не объекты, а сразу массив значений. И потом весь его писать в таблицу одним вызовом: sheet.getRange(sheet.getLastRow()+1,1,sortTasks.length,sortTasks[0].length).setValues(sortTasks);

Во-вторых, какой результат ожидается при повторном вызове функции? Новые задачи добавляются в конец таблицы или, как сейчас, перезаписывают существующие (оставляя хвост от старых, если новых меньше)? :)

Добрый день, @jankri

Хорошо, интересное замечание. Но вопрос, как вы будете переключать строку? Если нет счетчика.
Во-вторых, какой результат ожидается при повторном вызове функции? Новые задачи добавляются в конец таблицы или, как сейчас, перезаписывают существующие (оставляя хвост от старых, если новых меньше)? :) - это уже другая задача =) Плюс на какой была странице вызвана функция в той таблице и происходит запись, там уже заложена совсем другая логика и задача.

Функция sortTasks, которая хранит в себе результат вызова данных с сервера, потом используется и в другом месте.

Это очень интересное решение - sheet.appendRow(Object.values(arr[i])). Спасибо за подсказку

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории