首页 > 解决方案 > 当一个或多个单元格在一个范围内发生变化时运行触发脚本

问题描述

我是谷歌表格和脚本应用程序的新手。我正在使用谷歌表格来维护实时项目预算。我创建了一个历史选项卡来捕获历史高级信息(项目代码、类别、总批准预算、预计成本、日期戳)。每次脚本运行时,它都会捕获 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);
}

标签: google-apps-scriptgoogle-sheets

解决方案


解释:

您不需要可安装的触发器,因为您不使用任何需要许可的服务。

  • 您可以改用简单的onEdit(e)触发器。

为了定义S84:W87您希望接受编辑的范围,您可以这样做:

row>=84 && row <= 87 && col >=19 && col <=23

84是起始行,87是结束行,列19S,列23W

此外,您只想接受工作表上的编辑ForMaster

因此,该if声明将如下所示:

if(as.getName()=="ForMaster" && row>=84 && row <= 87 && col >=19 && 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" && row>=84 && row <= 87 && col >=19 && 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时触发。此函数不会被公式或其他脚本触发。

  • 同样,这是一个触发功能。你应该手动执行它,你实际上会得到错误。您所要做的就是将此代码片段保存到脚本编辑器,然后它将在编辑时自动触发。


推荐阅读