Я использую специальную функцию «Криптофинанс» в таблицах 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
Phil 31 Дек 2017 в 15:25

2 ответа

Лучший ответ

Вам нужно открыть электронную таблицу, а затем установить ее как активную:

var ss = SpreadsheetApp.openById("1234567890");
SpreadsheetApp.setActiveSpreadsheet(ss);

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#setActiveSpreadsheet(Spreadsheet)

2
NSchorr 31 Дек 2017 в 20:27

Короткий ответ

В триггерах, управляемых по времени, избегайте использования функций вызова, даже пользовательских функций, которые используют getActiveSpreadsheet и другие методы «активизации». Вместо этого используйте openById или другие подобные методы.

Объяснение

SpreadsheetApp.flush () гарантирует, что ожидающие изменения, внесенные в сценарий, будут применены, поэтому нет смысла помещать его в качестве первого действия функции.

С другой стороны, в Google Apps Script пользователь, открывший электронную таблицу, определяет, какая электронная таблица активна, для триггеров, управляемых по времени, getActiveSpreadsheet возвращает null, другими словами, мы могли бы сказать, что «активный» означает «используется в данный момент. пользователем ".

2
Phil 1 Янв 2018 в 15:45