我们有下面的Google Sheet脚本,它运行良好,但我们希望在只有子工作表时自动运行它"测试";范围A4编辑或更改,
我们对子表"测试"范围A进行任何更改或编辑,它将运行
function CopyPasteVal() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('test'), true);
spreadsheet.getRange('B:B').activate();
spreadsheet.getRange('C:C').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getActiveRangeList().setNumberFormat('0');
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('test'), true);
spreadsheet.getRange('A4').activate();
}
但如果我们在其他子表中进行任何更改,上述代码将不会运行。
说明:
请注意以下两件事:
-
您不需要激活范围或工作表,除非您明确希望在脚本运行时查看工作表中的更改。
-
您需要一个onEdit(e(触发器,它将充分利用事件对象。然后,您可以确保只有当活动工作表(您编辑的工作表(是
test
工作表并且编辑的单元格是A4
单元格时,才执行代码块。
解决方案:
function onEdit(e) {
const range = e.range;
const spreadsheet = e.source;
const as = spreadsheet.getActiveSheet();
if(as.getName()=='test' && range.getA1Notation() == "A4"){
const destRng = as.getRange('B:B');
as.getRange('C:C').copyTo(destRng, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
destRng.setNumberFormat('0');
}
}
您需要将逻辑放入一个简单的触发器函数中,在本例中为onEdit(e)
,并检查活动表是否为"测试";和编辑的范围,e.range
正是单元格A4:
function onEdit(e) {
var range = e.range;
var spreadsheet = SpreadsheetApp.getActive();
if (spreadsheet.getActiveSheet().getSheetName() == "test" && range.getA1Notation() == "A4") {
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('test'), true);
spreadsheet.getRange('B:B').activate();
spreadsheet.getRange('C:C').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getActiveRangeList().setNumberFormat('0');
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('test'), true);
spreadsheet.getRange('A4').activate();
}
}
参考文献:
简单触发器