#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:
Проблема / Объяснение:
- начинается с 1 getIndex(), и именно поэтому вы получаете индекс
activeSheet
, равный 1. - С другой стороны, в insertSheet(SheetName, sheetIndex)
sheetIndex
начинается с 0.
Если вы видите официальную документацию для insertSheet
:
Индекс вновь созданного листа. Чтобы вставить лист в качестве первого в электронной таблице, установите для него значение 0.
-
А именно, если вы хотите поместить
Generated
лист послеactiveSheet
того, как вам нужно вызвать:insertSheet(GENERATED, indexActiveSheet)
-
Например, в вашем случае
indexActiveSheet
равно 1. Чтобы поместить
Generated
лист на вторую позицию, вам также нужно 1, потому
что это то, чтоinsertSheet
принимается, если вы хотите поместить его на
вторую позицию. Помните, что ininsertSheet(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)
}
}