当特定 sheet 发生变化时触发

Trigger when change is happening in specific sheet

我有一个 sheet,其中包含通过 IMPORTRANGE 导入到另一个 sheet 的数据。当我更改 Spreadsheet 1 >>> Spreadsheet 2 时,我有一个脚本可以将数据从 Copy 复制到 Paste。它工作一切正常,但我想确保脚本仅在 'Copy' sheet 而不是任何其他内容中进行更改时运行。目前它运行独立于我所做的更改sheet。

Spreadsheet 1 Spreadsheet2

我尝试了两种不同的 onChange 触发器... 这一个进行更改,但在 sheets

中的任何一个中进行更改时触发
function Trigger2(e) {
  var sheet = e.source.getActiveSheet();
  if (sheet.getName() === 'Copy') {

copyInfo();

}
}

和 (这不起作用)

function Trigger2(e) {
  var sheet = e.source.getActiveSheet();
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  if( sheet.getActiveSheet().getName() !== "Copy" ) return;{

copyInfo();

}}

复制代码如下所示...


function copyInfo() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("Copy");
  var pasteSheet = ss.getSheetByName("Paste");

  // get source range
  var source = copySheet.getRange(2,1,12,8);
  // get destination range
  var destination = pasteSheet.getRange(2,1,12,8);

  // copy values to destination range
  source.copyTo(destination);
}

一个简单的 if 应该可以,但您试图将名称与错误的字段进行比较。根据Google的documentation,事件Objectereturns中的source字段电子表格 object,也就是整个文档。

相反,您可以使用 e.range 字段,其中包含进行编辑的确切范围,并且 Range class 有一个 getSheet() 方法来获取parent Sheet.

因此您可以将示例修改为以下内容:

function Trigger2(e) {
  var sheet = e.range.getSheet();
  if (sheet.getName() === 'Copy') {//Edit: this will only work if sheet is the most left sheet in the spreadsheet
    copyInfo();
  }
}

在导入范围更改后将更改从一个 Sheet 复制到另一个

Spreadsheet 2 从 Spreadsheet1 Sheet1 导入一个范围到 Sheet1 并且当 Spreadsheet2 发生变化时=22=]1 我们将数据从 Spreadsheet2 Sheet1 复制到 Spreadsheet2 Sheet 2.

function onMyChange(e) {
  //Logger.log(JSON.stringify(e));//useful during setup
  //e.source.toast("Entry");//useful during setup
  const sh = e.source.getSheetByName("Sheet1")
  Logger.log(sh.getName());
  if(e.changeType == "OTHER") {
    let tsh = e.source.getSheetByName("Sheet2"); 
    sh.getRange(2,1,12,8).copyTo(tsh.getRange(2,1));//Only need the upper left hand corner of the range.   Thus you change change the size of the source data without having to change the target range.
  }
}

人们可能倾向于尝试使用 e.source.getActiveSheet() 不幸的是,这并不需要得到你写的 sheet 除非是 SpreadsheetApp.getActive().getSheets()[0]。 onChange 事件对象总是 returns 在 spreadsheet 最左边 sheet 在这种情况下所以它不能用于识别正在写入的 sheet导入范围函数。

有了这个功能,您就不再需要其他功能了。