Значение GetValue скрипта Google Sheets не получает значения в пользовательском интерфейсе (последнее вычисление)

#javascript #google-sheets #google-sheets-api

#javascript #google-sheets #google-sheets-api

Вопрос:

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

 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:

Я думаю, что причина вашей проблемы в том, что лист не обновляется. В вашем случае, к сожалению, 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» предполагает пустую, и эта ячейка не связана с основными данными. Эта ячейка очищается. Таким образом, электронная таблица сообщает, что лист отредактирован.

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

 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». Я прошу прощения за эту ситуацию.

Если это не было полезно для вашей ситуации, я приношу свои извинения.