Электронная таблица().insertSheet(индекс, имя) вставляет лист не по индексу, а как последний лист

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

Когда я выполняю этот код, я ожидаю, что сгенерированный лист будет вставлен сразу после активного листа. Но это не так, он всегда создается как последний лист.

Допустим, у меня есть 2 листа: activeSheet и notActiveSheet и я запускаю этот код:

   var indexActiveSheet =  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getIndex()
  var nameActiveSheet =  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName()
  Logger.log(indexActiveSheet,nameActiveSheet)
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GENERATED);
  if  (sheet == null){
    sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(GENERATED, 1   indexActiveSheet)    
  }
  Logger.log(sheet.getIndex(), sheet.getName())
  

Но журналы и электронная таблица показывают, что это не так :

 [20-10-18 14:42:17:468 CEST] 1.0 activeSheet
[20-10-18 14:42:17:811 CEST] 3.0 Generated
  

Я ожидал

 [20-10-18 14:42:17:468 CEST] 1.0 activeSheet
[20-10-18 14:42:17:811 CEST] 2.0 Generated
  

Ответ №1:

Проблема / Объяснение:

Если вы видите официальную документацию для insertSheet :

Индекс вновь созданного листа. Чтобы вставить лист в качестве первого в электронной таблице, установите для него значение 0.

  • А именно, если вы хотите поместить Generated лист после activeSheet того, как вам нужно вызвать:

     insertSheet(GENERATED, indexActiveSheet)
      
  • Например, в вашем случае indexActiveSheet равно 1. Чтобы поместить
    Generated лист на вторую позицию, вам также нужно 1, потому
    что это то, что insertSheet принимается, если вы хотите поместить его на
    вторую позицию. Помните, что in insertSheet(sheetName, sheetIndex) sheetIndex=0 — это первый лист, sheetIndex=1 это второй лист.


Решение:

 function myFunction() {
  
  var GENERATED = 'Generated';
  var indexActiveSheet =  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getIndex()
  var nameActiveSheet =  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName()
  Logger.log(indexActiveSheet,nameActiveSheet)
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GENERATED);
  if  (sheet == null){
    sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(GENERATED, indexActiveSheet)    
  }
  Logger.log(sheet.getIndex(), sheet.getName())
  
}
  

Улучшения (необязательно):

Вам не нужно вызывать SpreadsheetApp.getActiveSpreadsheet так много раз, когда вы можете просто сохранить в переменную и использовать эту переменную вместо:

 function myFunction() {
  
  var GENERATED = 'Generated';
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var act_sh = ss.getActiveSheet();
  var indexActiveSheet =  act_sh.getIndex()
  var nameActiveSheet =  act_sh.getName()
  var sheet = ss.getSheetByName(GENERATED);
  if  (sheet == null){
    sheet = ss.insertSheet(GENERATED, indexActiveSheet)    
  }
}