#google-apps-script #google-sheets-formula
Вопрос:
Прочитав несколько сообщений, посвященных невозможности использования скрипта приложений для извлечения значения, полученного с помощью формулы, я подозреваю, что просто сжигаю ценный дневной свет на этом.
С помощью скрипта я извлек массив отображаемых значений с помощью getDisplayValues() и фактических (я думаю) значений с помощью getValues(). Каждый массив включает в себя весь столбец, в то время как на самом деле только ячейки 2-11 содержат выходные данные формулы.
Попытки извлечь значения из массива возвращают значение NULL.
var SpreadsheetID = "myID";
var SheetName = "mySheet";
function gammaTilt() {
var ss = SpreadsheetApp.openById(SpreadsheetID);
var sheet = ss.getSheetByName(SheetName);
var column = sheet.getRange("AH1:AH");
var dispVal = column.getDisplayValues(); // returns array of full column, including display values
var cellVal = column.getValues(); // returns array of full column, including actual (?) values
var label = dispVal[0][0]; // returns column header, a string value
var d = dispVal[11][0]; // returns null
var a = cellVal[11][0]; // returns null
};
Столбец AH динамичен по длине, поэтому решение должно найти длину диапазона данных, а затем последнее значение в диапазоне. Однако, похоже, что сценарий приложений не может найти диапазон, созданный формулой?
Это было бы намного сложнее сделать, но является ли единственным жизнеспособным подходом для разработки сценария приложений, который работает с исходным набором данных, а не с манипуляциями с этими данными в электронных таблицах?
ИЗМЕНИТЬ: Вывод журнала для cellVal
[21-09-14 13:02:33:500 PDT] Logging output too large. Truncating output.
[[All Date],
[Sun Aug 29 17:00:00 GMT-07:00 2021],
[Mon Aug 30 17:00:00 GMT-07:00 2021],
[Tue Aug 31 17:00:00 GMT-07:00 2021],
[Wed Sep 01 17:00:00 GMT-07:00 2021],
[Thu Sep 02 17:00:00 GMT-07:00 2021],
[Mon Sep 06 17:00:00 GMT-07:00 2021],
[Tue Sep 07 17:00:00 GMT-07:00 2021],
[Wed Sep 08 17:00:00 GMT-07:00 2021],
[Thu Sep 09 17:00:00 GMT-07:00 2021],
[Sun Sep 12 17:00:00 GMT-07:00 2021],
[Mon Sep 13 17:00:00 GMT-07:00 2021],
//The remainder of the array is empty cell values
Фактические значения ячеек с листа:
AH1 All Date
AH2 Mon Aug 30 2021
AH3 Tue Aug 31 2021
AH4 Wed Sep 1 2021
AH5 Thu Sep 2 2021
AH6 Fri Sep 3 2021
AH7 Tue Sep 7 2021
AH8 Wed Sep 8 2021
AH9 Thu Sep 9 2021
AH10 Fri Sep 10 2021
AH11 Mon Sep 13 2021
AH12 Tue Sep 14 2021
Есть идеи, почему строки даты смещены в возвращаемом массиве?
Комментарии:
1. Струны
Sun Aug 29 17:00:00 GMT-07:00 2021
выглядят немного странно. Попробуйте изменить формат этого столбца, чтобы увидеть время этих дат. Я подозреваю, что он сбрасывает время0:00:00
.2. Интересный. Только формат времени показывает 12:00:00 утра. Дата и время показывает дату время как 0:00:00. При добавлении AM / PM это возвращается к 12:00:00 утра. Сценарий по — прежнему извлекал даты со смещением. Вы спросили о часовом поясе — я в PST. Я изменил настройку с «Тихий океан» на «Тихий океан — Ванкувер» и бинго. Я изменил его обратно на Тихоокеанский, и проблема решена. Возвращаемая строка по-прежнему: [Пн 30 августа 00:00:00 GMT-07:00 2021], независимо от каких-либо изменений в форматировании столбцов.
Ответ №1:
индексы начинаются с 0 в appScript (как и в большинстве языков программирования). Таким образом, cellVal[11][0] пытается извлечь значение из ячейки AH12.
Если вы ищете значение из ячейки AH11, это cellVal[10][0]
кроме того, .getValues() не извлекает формулы, поэтому вы можете использовать их в безопасности, вам не нужно использовать .getDisplayValues()
Комментарии:
1. .getDisplayValues() используется в ситуациях, когда у вас есть отформатированное число, например «Вторник, 14 сентября 2021 года» в ячейке. .GetValue() извлекает базовое ЧИСЛОВОЕ значение этой даты, в то время как .getDisplayValue() извлекает этот фактический текст. Является ли эта дата результатом формулы или нет, не имеет значения.
2. Спасибо, что указали на структуру индекса. Я думал, что Javascript равен 0, а appScript-1, так что моя ошибка здесь. Спасибо также за дополнительную информацию о GetValue() и getDisplayValues(). Это полезное различие. Я не уверен, почему, но getValues() возвращает отображаемые даты на -1 день (т. Е. Понедельник, значение ячейки листа, возвращается как воскресенье).
3. @jivers дважды проверьте, что учетная запись google автора сценария и языковой стандарт листа (Файл>Настройки электронной таблицы) находятся в одном часовом поясе?
4. оба они настроены на один и тот же часовой пояс. Согласно комментариям Юрия, тестовый файл (оригинал не может быть передан) и скрипт создают массив с точными результатами. В исходном развернутом листе формула листа, формирующая список всех дат в столбце AH, УНИКАЛЬНА() (такая же, как в файле теста). Столбец в наборе данных, на который нацелена УНИКАЛЬНАЯ формула, также используется управляющим фильтром в Data Studio. Элемент управления отображает правильные даты, что исключает проблему форматирования.
5. @jivers хорошо. извините, что я не знаю, как действовать, не имея возможности воспроизвести проблему.
Ответ №2:
Попробуй это:
var d = dispVal[11][0];
var a = cellVal[11][0];
Обновить
Что касается «смещения» дат. Я уверен, что это связано с настройками часового пояса в настройках электронных таблиц.
Послушайте, я создал функцию, которая захватывает ваши даты и преобразует их в объекты дат:
function test_dates() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange('A1:A11');
var dates = range.getValues().map(x => [new Date(x[0])]); // strings --> objects
range.offset(0, 1).setValues(dates);
}
Если я установлю часовой пояс GMT 00, я получу «смещение»:
Если я установлю часовой пояс GMT-07, «смещение» исчезнет:
Что касается возврата «null», извините. Никаких догадок, если только нет воспроизводимого фрагмента кода фиктивных данных. Я попробовал ваш код с моими данными, и он работает просто отлично. Он возвращает значение из ячейки [11][0], независимо от того, было ли значение статическим или рассчитано по формуле.
Комментарии:
1. Это правильно нацелено на массив (мой плохой, отредактированный код), но все равно ничего не возвращает.
2. Поделитесь своим листом. Я чертовски уверен, что это просто еще одна глупая опечатка, подобная этой. Или просто попытайтесь сделать свой образец кода воспроизводимым. (И «ошибка» исчезает)