#google-apps-script #timestamp #google-sheets-formula
#google-приложения-скрипт #временная метка #google-sheets-формула
Вопрос:
Этот код отлично работает, когда данные редактируются в столбце 3 или копируются, но если курсор остается в столбце 1 во время копирования / вставки всей строки, он не будет обновляться, а во-вторых, если salesforce отправляет данные в столбец 3, это тоже не сработает, пожалуйста помоги мне здесь.
function onEdit() {
var s = SpreadsheetApp.getActiveSheet();
var sName = s.getName();
var r = s.getActiveCell();
var row = r.getRow();
var ar = s.getActiveRange();
var arRows = ar.getNumRows()
// Logger.log("DEBUG: the active range = " ar.getA1Notation() ", the number of rows = " ar.getNumRows());
if( r.getColumn() == 3 amp;amp; sName == 'Sheet1') { //which column to watch on which sheet
// loop through the number of rows
for (var i = 0;i<arRows;i ){
var rowstamp = row i;
SpreadsheetApp.getActiveSheet().getRange('F' rowstamp.toString()).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm"); //which column to put timestamp in
}
}
}//setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm:ss");
Ответ №1:
Объяснение:
Три важные вещи, которые нужно знать:
- Как также указано в официальной документации,
onEdit
триггеры запускаются при редактировании пользователем. Эта функция не будет запускаться формулой или другим скриптом. Если salesforce или любая другая служба, кроме пользователя, отредактирует столбецC
onEdit
, триггер не будет активирован. Существуют обходные пути, но они зависят от контекста вашей конкретной проблемы. Я бы посоветовал вам поискать или задать конкретный вопрос по этому поводу. - Что касается другой вашей проблемы, вам следует избавиться от активных диапазонов и воспользоваться преимуществами объекта event. Этот объект содержит информацию о внесенных пользователем изменениях/ правках.
- Как рекомендуется в рекомендациях, вы не должны устанавливать значения на листе итеративно, но вы можете сделать это за один раз, выбрав диапазон ячеек и установив значения. В вашем случае вы хотите установить одинаковое значение во всех ячейках нужного диапазона, следовательно
setValue
, используется вместоsetValues
. Но идея состоит в том, чтобы избавиться отfor
петли.
Решение:
function onEdit(e) {
var s = e.source.getActiveSheet();
var sName = s.getName();
var ar = e.range;
var row = ar.getRow();
var arRows = ar.getNumRows()
if( ar.getColumn() == 3 amp;amp; sName == 'Sheet1') {
s.getRange(row,6,arRows).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm");
}
}
Примечание:
Опять же, onEdit
это триггерная функция. Вы не должны выполнять это вручную, и если вы это сделаете, вы действительно получите ошибки (из-за использования объекта event). Все, что вам нужно сделать, это сохранить этот фрагмент кода в редакторе сценариев, и тогда он будет автоматически запускаться при редактировании.
Комментарии:
1. Спасибо, Мариос, я ценю твой быстрый ответ. Я попытался запустить ваш код, но он выдает ошибку «Не удается прочитать свойство ‘source’ неопределенного». Я даже заменил его на SpreadsheetApp.getActiveSpreadsheet(), но затем он показал мне ошибку range undefined, любой намек, заранее спасибо!
2. Извините, я понял, что теперь он работает нормально, когда в столбце C есть активный курсор и данные вставляются или обновляются. Спасибо
3. @PratibhaRajpoot рад, что все получилось. Подумайте о том, чтобы принять ответ, нажав на кнопку «Отметить галочкой» слева от ответа.
4. В объекте события: источник = объект электронной таблицы, представляющий файл Google Sheets, к которому привязан скрипт. Электронная таблица. Когда я строю объект события, я вижу {}. Нет указания, какой лист в электронной таблице был изменен. Являются ли триггеры полезными только тогда, когда есть один лист, или какой лист изменен, не имеет значения?
5. @aNewb спасибо за ваш комментарий.
e.source
действительно, дает вамspreadsheet
объект, к которому привязан скрипт. Из этого объекта вы можете получить отредактированный лист :sheet = e.source.getActiveSheet()
. И из этого вы можете получить название листа или любую другую информацию об этом листе (gid
) или что-то еще. Напримерsheet.getName()
. Поэтому вы можете указать имя листа в качестве условия (как мой ответ выше) для выполнения некоторого кода только для определенных листов (вкладок) в файле электронной таблицы.