Запуск сценария запуска при изменении одной или нескольких ячеек в диапазоне

#google-apps-script #google-sheets

#google-apps-script #google-таблицы

Вопрос:

Я новичок в приложении Google sheets amp; script. Я использую Google таблицы для ведения бюджетов проектов в режиме реального времени. Я создал вкладку «История» для сбора исторической информации высокого уровня (код проекта, категория, общий утвержденный бюджет, прогнозируемая стоимость, отметка даты). Каждый раз, когда запускается scrip, он захватывает 4 строки данных.

 function recordHistory() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('ForMaster');
  var sheet2 = ss.getSheetByName('History');
  var data = sheet1.getRange('S84:W87').getValues();
  var last_row = sheet2.getLastRow();

  sheet2.getRange(last_row   1,1,4,5 ).setValues(data);
}
 

Я хотел бы настроить триггер, который запускается везде, где когда-либо происходит изменение любой из ячеек в диапазоне данных (S84: W87).

Я пробовал следующее, но, похоже, это не работает.

 function setupTrigger() {
  ScriptApp.newTrigger('recordHistory')
  .forSpreadsheet('1TSX27lzmOpv6P8Z8zJJhYem_yLQwP-gYK4WYHJ3LEuA')
  .onEdit()
  .create();
}

function recordHistory(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('ForMaster');
  var sheet2 = ss.getSheetByName('History');
  var data = sheet1.getRange('S84:W87').getValues();
  var last_row = sheet2.getLastRow();
  
  sheet2.getRange(last_row   1,1,4,5 ).setValues(data);
}
 

Ответ №1:

Объяснение:

Вам не нужен устанавливаемый триггер, поскольку вы не используете какие-либо службы, требующие разрешения.

  • Вместо этого вы можете использовать простой onEdit(e) триггер.

Чтобы определить диапазон S84:W87 , в котором вы хотели бы принимать изменения, вы можете сделать это:

row>=84 amp;amp; row <= 87 amp;amp; col >=19 amp;amp; col <=23

84 является начальной строкой, 87 является конечной строкой, столбец 19 есть S , а столбец 23 есть W .

Также вы хотите принимать изменения только на листе ForMaster .

Следовательно if , утверждение будет выглядеть следующим образом:

if(as.getName()=="ForMaster" amp;amp; row>=84 amp;amp; row <= 87 amp;amp; col >=19 amp;amp; col <=23)

Решение:

 function onEdit(e) {
  const ss = e.source;
  const as = ss.getActiveSheet();
  const row = e.range.getRow();
  const col = e.range.getColumn(); 
  if(as.getName()=="ForMaster" amp;amp; row>=84 amp;amp; row <= 87 amp;amp; col >=19 amp;amp; col <=23){
     const sheet2 = ss.getSheetByName('History');
     const data = as.getRange('S84:W87').getValues();
     const last_row = sheet2.getLastRow();
     sheet2.getRange(last_row   1,1,data.length,data[0].length).setValues(data);
  }
}
 

Обратите внимание на это!

  • onEdit Триггеры срабатывают при редактировании пользователем. Эта функция не будет запускаться формулой или другим скриптом.
  • Опять же, это триггерная функция. Вы не должны выполнять его вручную, и вы действительно получите ошибки. Все, что вам нужно сделать, это сохранить этот фрагмент кода в редакторе скриптов, и тогда он будет автоматически запущен при редактировании.

Комментарии:

1. Это сработало как по волшебству! Спасибо , Мариос