简体   繁体   中英

Google Apps Script - Run Same Code on Dynamically Changing Tab Numbers

I would like the below code to run on how ever many tabs get created - after Sheet 7 (First 7 tabs always remain unchanged). Currently I use an array and must number them which works if you know exactly how many tabs get created - which I dont always know. So I currently create script for [7] then [8] etc etc. this does return an error when I say have [20] but Tab 20 doesnt exist.

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

Explanation:

  • Use getSheet().slice(7) to get from 8th sheet onwards. See here how slice works.

  • Then you can use forEach() to iterate through every sheet (after sheet 7th).

  • I also removed some unnecessary lines of codes. For example, you use SpreadsheetApp.getActive() multiple times in the sheet or you define the same variables twice like ss or sheet .

  • Since you are interacting with the sheets iteratively you might need to use SpreadsheetApp.flush() to make sure all the pending changes are completed.

Solution:

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM