首页 > 解决方案 > Google Apps 脚本 - 在动态更改选项卡编号上运行相同的代码

问题描述

我希望下面的代码在创建多少个选项卡时运行 - 在 Sheet 7 之后(前 7 个选项卡始终保持不变)。目前我使用一个数组并且必须给它们编号,如果您确切知道创建了多少个选项卡,那么它可以工作 - 我并不总是知道。所以我目前为 [7] 然后 [8] 等创建脚本。当我说有 [20] 但选项卡 20 不存在时,这确实返回错误。

 function Company_ONE() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[7]; //SHEET 8
 var ss = SpreadsheetApp.getActive();   
 var sheet = ss.getSheets()[7];  
 var lr = sheet.getLastRow();
 var cell = SpreadsheetApp.getActive().getRange('AK3');
 var criteria = SpreadsheetApp.DataValidationCriteria.CHECKBOX;
 var rule = SpreadsheetApp.newDataValidation()
 .requireCheckbox()
 .build();
 cell.setDataValidation(rule);
 sheet.getRange('AK3').activate();
 var destinationRange = sheet.getActiveRange().offset(0, 0, lr-3);
 sheet.getRange('AK3').copyTo(destinationRange);
 }

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释:

  • 用于getSheet().slice(7)从第 8 页开始。在这里查看slice 的工作原理。

  • 然后您可以使用forEach()遍历每张纸(在第 7 张纸之后)。

  • 我还删除了一些不必要的代码行。例如,您SpreadsheetApp.getActive()在工作表中使用了多次,或者您将相同的变量定义了两次,如ssor sheet

  • 由于您正在迭代地与工作表交互,您可能需要使用SpreadsheetApp.flush()来确保完成所有未决的更改。

解决方案:

function Company_ONE() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheets = ss.getSheets().slice(7); // get 8th sheet onwards
 
 sheets.forEach(sheet=>{
   var lr = sheet.getLastRow();
   var cell = ss.getRange('AK3');
   var criteria = SpreadsheetApp.DataValidationCriteria.CHECKBOX;
   var rule = SpreadsheetApp.newDataValidation()
             .requireCheckbox()
             .build();
   cell.setDataValidation(rule);
   sheet.getRange('AK3').activate();
   var destinationRange = sheet.getActiveRange().offset(0, 0, lr-3);
   sheet.getRange('AK3').copyTo(destinationRange);
   SpreadsheetApp.flush();
 });

}

推荐阅读