如何在多个电子表格选项卡上运行脚本

时间:2021-03-18 07:10:54

标签: google-apps-script timestamp

我写这篇文章是为了了解如何在一个 Google 电子表格文件中的多个选项卡(工作表)上运行脚本。

1.我想用脚本做什么:

  • 当特定列(此处为“状态”列)被编辑时,在“状态”(此处为“时间戳”列)之后的列中添加自动时间戳。

2.电子表格中所有标签的背景:

  • 电子表格中有 6 个标签。
  • 'status' 和 'timestamp' 并不总是在每个选项卡的同一列中。 例如,在 Apple 标签上,'status' 在 A 列中,'timestamp' 在 B 列中。但是,在 Banana 标签上,'status' 在 C 列中,'timestamp' 在 D 列中。这些不能更改。

3.我遇到的问题:

  • 只有最后一个脚本会在我保存后立即生效。
<块引用>

step1:写下标签Apple的代码并保存,脚本将在Apple上运行。

<块引用>

step2:写下标签 Banana 的代码(在同一个脚本文件中,紧跟在 Apple 的代码之后)并保存,脚本将在 Banana 上工作,但不再在 Apple 上工作。

4.到目前为止我尝试过的(不起作用):

  • 通过创建多个脚本文件来分离代码

5.我使用的代码:

    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);
    }
}

2 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为我刚刚找到了出路。 超级欢迎任何其他解决方案!

简而言之,我使用 if 函数来连接每个选项卡的代码。

  • 如果是“Apple”选项卡,则执行此操作
  • 如果是标签“香蕉”,则执行此操作

我使用的代码如下所示:

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);}

答案 1 :(得分:0)

  • 假设 statusstatus 列的标题值,您可以使用 getRange(a1Notation)findIndex 以编程方式查找此标题的列索引;无需为所有工作表明确指定(当只有两张工作表时这是可行的,但如果使用 6 张工作表可能会很烦人)。
  • 您也可以使用 Range.offset() 来获取下一列的单元格,而不是使用 getRange(row, column)

代码片段:

考虑到前面几点,您的代码可以大大简化:

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);