2016-10-07 14 views
0

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

загружает в листе или диапазон его, как это:

var ss = SpreadsheetApp.openById(ssId); 
dataSheet = ss.getSheetByName('Projects'); 
var data = dataSheet.getRange('A1:BL').getValues(); 

Я сделал много испытаний, и с моей слегка населенной A1: BL5500 таблицу (с изрядным числом ячейки, заполненные несколькими десятками символов текста), время загрузки занимает около 6 секунд. Я пробовал названные диапазоны и множество вещей, но не могу получить его быстрее, чем это.

Мне действительно нужно 1 столбец листа, затем я ищу поиск нужной строки, а затем мне нужна эта строка. Но загрузка столбца 1 занимает примерно столько же времени, сколько и загрузка всего объекта. Есть лучший способ сделать это? Задержка является проблематичной.

Вот разбивка времени:

SpreadsheetApp.openById(ssid) [0.174 seconds] 
Spreadsheet.getSheetByName([Projects]) [0 seconds] 
Sheet.getRange([A1:BL]) [0.387 seconds] 
Range.getValues() [6.483 seconds] 

Для сравнения, вот загружается только один столбец:

SpreadsheetApp.openById(ssid) [0.164 seconds] 
Spreadsheet.getSheetByName([Projects]) [0 seconds] 
Sheet.getRange([A1:A]) [0.336 seconds] 
Range.getValues() [5.887 seconds] 

Это только один работает, временные различия не существенны (они различаются).

+0

У меня есть работа: я создал новый лист, один столбец которого равен столбцу, который мне нужно найти. Я загружаю это. Когда я заканчиваю свой поиск, я загружаю только соответствующую строку из полного листа. Это занимает общее время примерно от 8 секунд до 2, что может быть приемлемым. – KeithKeithBoBeith

+0

Пожалуйста, добавьте это решение в качестве ответа. –

+0

Я также обнаружил, что синтаксический анализ опубликованных csv ss будет намного быстрее. –

ответ

0

Как я уже отмечал выше, я нашел один ответ, который может быть полезен другим. Я создал второй лист («ProjectIndex») и установил два столбца, которые просто указывали на соответствующие столбцы, представляющие интерес в «Проекты» (изначально я сказал, что просто искал один столбец, чтобы упростить его: m фактически ищет два). Загрузите эти данные, найдите интересующую вас строку и вернитесь в «Проекты» и загрузите только ту строку, которую я хочу.

var ss = SpreadsheetApp.openById(ssId); 
dataSheet = ss.getSheetByName('ProjectIndex'); 
var data = dataSheet.getRange('A1:B').getValues(); 

... // search data and find row i 

var j = i+1; // account for zero-based array but 1-based row numbering 
var rc = 'A'+j+':BL'+j; // there are BL columns in Projects 
var record = ss.getSheetByName('Projects').getRange(rc).getValues(); 

Время загрузки ProjectIndex:

SpreadsheetApp.openById(ssid) [0.153 seconds] 
Spreadsheet.getSheetByName([ProjectIndex]) [0 seconds] 
Sheet.getRange([A1:B]) [0.282 seconds] 
Range.getValues() [0.504 seconds] 

Время загрузки одного ряда проектов:

Spreadsheet.getSheetByName([Projects]) [0 seconds] 
Sheet.getRange([A4785:BL4785]) [0.513 seconds] 
Range.getValues() [0.352 seconds] 

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

Смежные вопросы