#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». Я прошу прощения за эту ситуацию.
Если это не было полезно для вашей ситуации, я приношу свои извинения.