当特定 sheet 发生变化时触发
Trigger when change is happening in specific sheet
我有一个 sheet,其中包含通过 IMPORTRANGE 导入到另一个 sheet 的数据。当我更改 Spreadsheet 1 >>> Spreadsheet 2 时,我有一个脚本可以将数据从 Copy 复制到 Paste。它工作一切正常,但我想确保脚本仅在 'Copy' sheet 而不是任何其他内容中进行更改时运行。目前它运行独立于我所做的更改sheet。
我尝试了两种不同的 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,事件Objecte
returns中的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导入范围函数。
有了这个功能,您就不再需要其他功能了。
我有一个 sheet,其中包含通过 IMPORTRANGE 导入到另一个 sheet 的数据。当我更改 Spreadsheet 1 >>> Spreadsheet 2 时,我有一个脚本可以将数据从 Copy 复制到 Paste。它工作一切正常,但我想确保脚本仅在 'Copy' sheet 而不是任何其他内容中进行更改时运行。目前它运行独立于我所做的更改sheet。
我尝试了两种不同的 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,事件Objecte
returns中的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导入范围函数。
有了这个功能,您就不再需要其他功能了。