Я использую специальную функцию «Криптофинанс» в таблицах Google. Я написал собственный сценарий, который запускается ежедневно, используя триггерные функции сценариев приложения.
function daily() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Liquidity");
var value = sh.getRange("B36").getValue();
var lastRow = whichRow();
lastRow += 1;
ss.getSheetByName("Liquidity over time").getRange("B" + lastRow).setValue(value);
ss.getSheetByName("Liquidity over time").getRange("A" + lastRow).setValue(new Date());
}
function whichRow() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Avals = ss.getSheetByName("Liquidity over time").getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
return Alast;
}
В основном он должен взять значение из поля и добавить строку, чтобы я мог запустить диаграмму в этом столбце.
Когда я запускаю его вручную из редактора сценариев, результат может выглядеть следующим образом:
1337999,52
Вывод, когда он запускается ежедневной функцией, выглядит следующим образом:
#NAME?
Это не помогло с функцией .flush (), и я не смог понять жизненный цикл листов в сочетании с пользовательской функцией.
Как я могу убедиться, что лист предварительно загружен перед запуском скрипта?
2 ответа
Вам нужно открыть электронную таблицу, а затем установить ее как активную:
var ss = SpreadsheetApp.openById("1234567890");
SpreadsheetApp.setActiveSpreadsheet(ss);
Короткий ответ
В триггерах, управляемых по времени, избегайте использования функций вызова, даже пользовательских функций, которые используют getActiveSpreadsheet и другие методы «активизации». Вместо этого используйте openById или другие подобные методы.
Объяснение
SpreadsheetApp.flush () гарантирует, что ожидающие изменения, внесенные в сценарий, будут применены, поэтому нет смысла помещать его в качестве первого действия функции.
С другой стороны, в Google Apps Script пользователь, открывший электронную таблицу, определяет, какая электронная таблица активна, для триггеров, управляемых по времени, getActiveSpreadsheet возвращает null, другими словами, мы могли бы сказать, что «активный» означает «используется в данный момент. пользователем ".
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.