我写这篇文章是为了了解如何在一个谷歌电子表格文件中的多个选项卡(工作表)上运行脚本。
我遇到的问题:
第1步:写下Apple选项卡的代码并保存,脚本将在Apple上运行。
第2步:写下Banana选项卡的代码(在同一个脚本文件中,就在Apple代码之后)并保存,脚本将在Banana上运行,但不再在Apple上运行。
到目前为止我尝试过的(不起作用):
function onEdit(e) {
addTimestamp(e);
}
function addTimestamp(e){
var startRow = 2;
var targetColumn = 24;
var ws = "Apple";
var row = e.range.getRow();
var col = e.range.getColumn();
if(col === targetColumn && row >= startRow && e.source.getActiveSheet().getName() === ws){
var time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
e.source.getActiveSheet().getRange(row,25).setValue(time);
}
}
function addTimestamp(e){
var startRow = 2;
var targetColumn = 66;
var ws = "Banana";
var row = e.range.getRow();
var col = e.range.getColumn();
if(col === targetColumn && row >= startRow && e.source.getActiveSheet().getName() === ws){
var time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
e.source.getActiveSheet().getRange(row,67).setValue(time);
}
}
status
是 status
列的标题值,您可以使用 getRange(a1Notation) 和 findIndex 以编程方式查找此标题的列索引;无需为所有工作表明确指定(当只有两张工作表时这是可行的,但如果有 6 张工作表可能会变得烦人)。考虑到前面的几点,您的代码可以大大简化:
function addTimestamp(e) {
const range = e.range;
const sheet = range.getSheet();
const statusColumn = sheet.getRange("1:1").getValues()[0]
.findIndex(header => header === "status") + 1;
if (range.getColumn() === statusColumn && range.getRow() > 1) {
const time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
range.offset(0,1).setValue(time);
}
}
如果您也想通过标题名称查找
timestamp
列,只需替换此:
range.offset(0,1).setValue(time);
有了这个:
const timestampColumn = sheet.getRange("1:1").getValues()[0]
.findIndex(header => header === "timestamp") + 1;
sheet.getRange(range.getRow(), timestampColumn).setValue(time);
回答我自己的问题,因为我刚刚找到了出路。 超级欢迎任何其他解决方案!
简而言之,我使用 if 函数来连接每个选项卡的代码。
我正在使用的代码如下所示:
function onEdit(e) {
addTimestamp(e);
}
function addTimestamp(e){
var row = e.range.getRow();
var col = e.range.getColumn();
if(e.source.getActiveSheet().getName() === "Apple" && col === 23 && row >= 2){
var time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
e.source.getActiveSheet().getRange(row,24).setValue(time);}
if(e.source.getActiveSheet().getName() === "Banana" && col === 55 && row >= 2){
var time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
e.source.getActiveSheet().getRange(row,56).setValue(time);}