Сценарий Google Sheets getValue не получает значения в пользовательском интерфейсе (последний расчет) - PullRequest
0 голосов
/ 22 апреля 2019

Я пишу простой скрипт, который в основном читает значение и отправляет его на другой лист после нажатия кнопки. Для тестирования я написал:

SpreadsheetApp.flush()
var sheet = localSheet.getSheetByName('Input');
var dateTimeRange = sheet.getRange(2,2);
var dateTimeValue = dateTimeRange.getDisplayValue();  
localSheet.toast(readingValue, dataTypeValue)

В настройках электронных таблиц я установил: Файл-> Настройки электронной таблицы-> Расчет-> При изменении и каждую минуту

Ячейка в диапазоне 2,2 имеет

=now()

Итак, каждую минуту значение в ячейке 2,2 пересчитывается само. Но когда я запускаю сценарий, выходное значение, которое я вижу, всегда равно значению последнего изменения листа. Пока я не взаимодействую с листом, скрипт не может прочитать новое значение. Я попытался добавить flush (), не работает. У кого-нибудь есть идеи?

Спасибо.

1 Ответ

0 голосов
/ 22 апреля 2019

Я думаю, что причина вашей проблемы в том, что лист не обновляется. В вашем случае, к сожалению, flush() нельзя использовать. Чтобы избежать этой проблемы, как насчет следующих обходных путей? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

В вашей ситуации, когда лист редактируется, значение, извлекаемое с помощью getDisplayValue(), обновляется. В этом ответе это используется.

Обходной путь 1:

В этом обходном пути ячейка "B2" перезаписывается на =NOW().

Модифицированный скрипт:

var localSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = localSheet.getSheetByName('Input');
var dateTimeRange = sheet.getRange(2, 2);
var dateTimeValue = dateTimeRange.setFormula("=NOW()").getDisplayValue(); // Modified
localSheet.toast(dateTimeValue);

Обходной путь 2:

В этом обходном пути очищается пустая ячейка. В примере сценария ячейка «B3» предполагает пустую ячейку, и эта ячейка не связана с основными данными. Эта ячейка очищена. Таким образом, пусть Spreadsheet знает, что лист редактируется.

Модифицированный скрипт:

var localSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = localSheet.getSheetByName('Input');
var dateTimeRange = sheet.getRange(2, 2);
sheet.getRange("B3").clear(); // Added
var dateTimeValue = dateTimeRange.getDisplayValue();
localSheet.toast(dateTimeValue);
  • Значение «B2» на листе «Ввод» обновляется, даже если отредактированная ячейка отличается от основного листа. Таким образом, вы также можете использовать localSheet.getSheetByName("Sheet1").getRange("A1").clear() вместо sheet.getRange("B3").clear().

Примечание:

  • Похоже, ваш сценарий не самый последний.
    • Является ли localSheet var localSheet = SpreadsheetApp.getActiveSpreadsheet()?
    • readingValue и dataTypeValue не объявлены. В этом ответе используется dateTimeValue.
  • В описанных выше обходных решениях значение обновляется. Но найденное значение показывает значение на 4 или 5 секунд быстрее каждый раз. Об этом я не мог найти, чтобы сделать то же самое значение с "B2". Я прошу прощения за эту ситуацию.

Если это не помогло в вашей ситуации, я прошу прощения.

...