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

问题描述 投票:0回答:2

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

  1. 我想用脚本做什么:
  • 编辑特定列(此处为“状态”列)时,在“状态”后面的列(此处为“时间戳”列)中添加自动时间戳。
  1. 电子表格中所有选项卡的背景:
  • 电子表格中有 6 个选项卡。
  • “状态”和“时间戳”并不总是位于每个选项卡的同一列中。 例如,在 Apple 选项卡上,“状态”位于 A 列,“时间戳”位于 B 列。但是,在 Banana 选项卡上,“状态”位于 C 列,“时间戳”位于 D 列。这些无法更改。
  1. 我遇到的问题:

    • 只有最后一个脚本在我保存后才可以运行。

    第1步:写下Apple选项卡的代码并保存,脚本将在Apple上运行。

    第2步:写下Banana选项卡的代码(在同一个脚本文件中,就在Apple代码之后)并保存,脚本将在Banana上运行,但不再在Apple上运行。

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

  • 通过创建多个脚本文件来分离代码
  1. 我正在使用的代码:
    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);
        }
    } 
    
google-sheets google-apps-script triggers timestamp
2个回答
0
投票
  • 假设
    status
    status
    列的标题值,您可以使用 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);

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);}
© www.soinside.com 2019 - 2024. All rights reserved.