The Google Sheets API lets you read, write, and format Google Sheets data with your preferred programming language, including Java, JavaScript, and Python - пишут на странице официальной документации. А что если можно использовать его вместо SpreadsheetApp - основного инструмента для работы с данными таблиц в Google apps script, для ускорения получения и записи данных.
Операции чтения и записи в таблицах самые долгие, зачастую отнимающие львиную долю времени отведённого в 6 минут работы скрипта. Конечно, бывают скрипты, которые работают с данными неправильно - читают или записывают ячейки по одной, когда можно получить данные сотен и тысяч ячеек за один вызов, обработать массив данных в памяти и вставить данные также массивом в сотни и тысячи ячеек. Порой достаточно переписать исходный код и операции которые не укладывались в 6 будут отрабатывать меньше одной минуты.
В статье речь пойдёт немного о другом - о преимуществах, которые может предложить Sheets Api, в сравнении с SpreadsheetApp.
Для примера возьмём открытые данные Министерства культуры Российской Федерации о библиотеках. Импортируем данные в гугл таблицу. Откроем редактор скриптов. Для начала работы c Sheets Api необходимо подключить его в Сервисах, по-умолчанию он не включён.
function getAllValues() {
console.time('app')
ss.getSheetByName('Данные').getDataRange().getValues()
console.timeEnd('app')
}
function getAllValues(){
console.time('app')
Sheets.Spreadsheets.Values.get(ssId,"'Данные'!A3:AZ").values
console.timeEnd('app')
}
HttpResponseException: Response Code: 413. Message: response too large.
function getAllValues() {
const ss=SpreadsheetApp.getActive()
const ssId=ss.getId()
console.time('api')
Sheets.Spreadsheets.Values.get(ssId,"'Данные'!A3:AZ10000").values.concat(Sheets.Spreadsheets.Values.get(ssId,"'Данные'!A10001:AZ").values)
console.timeEnd('api')
console.time('app')
ss.getSheetByName('Данные').getDataRange().getValues()
console.timeEnd('app')
}
function getOneColumnValues(){
const ss = SpreadsheetApp.getActive()
const ssId = ss.getId()
console.time('api')
Sheets.Spreadsheets.Values.get(ssId, "'Данные'!A3:A").values
console.timeEnd('api')
console.time('app')
ss.getSheetByName('Данные').getRange('A3:A').getValues()
console.timeEnd('app')
}
function getSeveralColumnsValues(){
const ss = SpreadsheetApp.getActive()
const ssId = ss.getId()
console.time('api')
Sheets.Spreadsheets.Values.get(ssId, "'Данные'!A3:A").values
Sheets.Spreadsheets.Values.get(ssId, "'Данные'!AE3:AK").values
console.timeEnd('api')
console.time('app')
const sheet=ss.getSheetByName('Данные')
sheet.getRange('A3:A').getValues()
sheet.getRange('AE3:AK').getValues()
console.timeEnd('app')
}
function getSeveralColumnsValuesBatch(){
const ss = SpreadsheetApp.getActive()
const ssId = ss.getId()
console.time('api')
Sheets.Spreadsheets.Values.batchGet(ssId,{ranges:["'Данные'!A3:A","'Данные'!AE3:AK"]}).valueRanges.map(r=>r.values)
console.timeEnd('api')
console.time('app')
const sheet=ss.getSheetByName('Данные')
sheet.getRange('A3:A').getValues()
sheet.getRange('AE3:AK').getValues()
console.timeEnd('app')
}
Спасибо! Будет куда послать за примером на русском языке.
ОтветитьУдалитьПожалуйста. Очень рад!
УдалитьЗдравствуйте. Подскажите пожалуйста, как можно ускорить работу выпадающего списка , состоящий из 30000 слов (слова эти не импортируются, они уже находятся на другом Листе)? Заранее спасибо.
ОтветитьУдалитьСкорее всего никак. Можно попробовать разбить на зависимые списки, но не факт, конечно.
УдалитьНикак. Вопрос в другом - где может понадобиться выбор из 30000 пунктов?
УдалитьУ меня имеется своя библиотека товаров. Это не большая энциклопедия, просто странно, что данную задачу не разрешить никак. Задача не такая уж и сложная. Без каких либо наворотов и больших формул , просто делать отсев этих товаров, что бы впр выдавал нужную им категорию. Всё! В листе находится 3 колонки и никакого форматирования. Неужели это не решить?
УдалитьПроблема в объеме данных на элемент одного списка. Потом у вас возникает 100 таких списков и в каждом из них по 30 000 записей. Но вообще, вопрос не по адресу -- пишите в Гугл. Как вариант, можно организовать выбор через интерфейс (боковое меню или модальное окно).
Удалить