Скрипт приложений для обновления временной метки при автоматической вставке данных в Google Sheet

#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() . Поэтому вы можете указать имя листа в качестве условия (как мой ответ выше) для выполнения некоторого кода только для определенных листов (вкладок) в файле электронной таблицы.