【问题标题】:Google Sheets script - code optimization - one script, two sheets, same workbookGoogle Sheets 脚本 - 代码优化 - 一个脚本,两个工作表,同一个工作簿
【发布时间】:2021-04-27 17:21:14
【问题描述】:

我有一个包含多个工作表的工作簿,并且我一直在其中两个工作表上运行一些简单的脚本(这些工作表基本上是彼此的副本)。

一旦脚本根据在其中一个单元格中输入的值创建一个下拉列表,而第二个脚本根据新下拉列表的编辑时间添加时间戳。

最初我在第一张纸上运行了两个 onEdit 函数。 然后我创建了这些函数的副本,稍作修改,以在另一张工作表(同一工作簿)上运行

鉴于我真的不知道如何为每个工作表创建一个单独的脚本,我现在有一个包含 4 个类似 onEdit 函数的脚本。

由于我是一个完全的新手,我确信有更好、更有效的方法来编写此代码。 感谢您在优化此方面的帮助。

function onEdit(e) {

addTimestamp(e);
addTimestamp2(e);
Dropdown(e);
Dropdown2(e);

}

function addTimestamp(e) {

  var startRow = 2;
  var targetColumn = 10;
  var ws = "Tracker1";

var row = e.range.get.Row();
var col = e.range.getColumn();

if(col === targetColumn && row >= startRow && e.source.getActiveSheet().getName() === ws) {

var currentDate = new Date();
e.source.getActiveSheet().getRange(row,11).setValue(currentDate);

}
}

function addTimestamp2(e) {

  var startRow = 2;
  var targetColumn = 10;
  var ws = "Tracker2";

var row = e.range.get.Row();
var col = e.range.getColumn();

if(col === targetColumn && row >= startRow && e.source.getActiveSheet().getName() === ws) {

var currentDate = new Date();
e.source.getActiveSheet().getRange(row,11).setValue(currentDate);

}
}

function Dropdown(){
 var tabLists = "StatusFlow";
 var tabValidation = "Tracker1"
 var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);

 var activeCell = ss.getActiveCell();

 if(activeCell.getColumn() == 9 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){
  
  activeCell.offset(o,1).clearContent().clearDataValidations();

  var makes = datass.getRange(1,1,1, datass.getLastColumn()).getValues();

  var makeIndex = makes[0].indexOf(activeCell.getValue()) +1;

  if(makeIndex !=0) {

   var validationRange = datass.getRange(2, makeIndex, datass.getLastRow());
   var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).setAllowInvalid(false).build();
   activeCell.offset(0, 1).setDataValidation(validationRule);

}
}
}

function Dropdown2(){
 var tabLists = "StatusFlow";
 var tabValidation = "Tracker2"
 var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);

 var activeCell = ss.getActiveCell();

 if(activeCell.getColumn() == 9 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){
  
  activeCell.offset(o,1).clearContent().clearDataValidations();

  var makes = datass.getRange(1,1,1, datass.getLastColumn()).getValues();

  var makeIndex = makes[0].indexOf(activeCell.getValue()) +1;

  if(makeIndex !=0) {

   var validationRange = datass.getRange(2, makeIndex, datass.getLastRow());
   var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).setAllowInvalid(false).build();
   activeCell.offset(0, 1).setDataValidation(validationRule);

}
}
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这是替换两个addTimestamp 函数的更有效方法:

    function onEdit(e) {
      var activeSheet = e.source.getActiveSheet();
      var activeSName = activeSheet.getName();
      var row = e.range.get.Row();
      var col = e.range.getColumn();
    
      if ((activeSName == 'Tracker1' || activeSName == 'Tracker2') && col === 10 && row >= 2) { 
        activeSheet.getRange(row, 11).setValue(new Date());
      }
    }
    

    您可以试一试这两个Dropdown 函数,看看是否可以做类似的事情。没有什么比边做边学更重要的了。 :-D

    请注意,在onEdit 中,您将e 传递给这些Dropdown 函数。但不在这些函数中使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2013-09-01
      相关资源
      最近更新 更多