Как настроить поток на количество листов в скрипте Google Apps?

#google-apps-script

#google-apps-script

Вопрос:

Я создаю форму в GAS, ответы на которую я размещаю в электронной таблице контейнера, используя этот setDestination() метод. По умолчанию он помещается на первый лист, но я хочу, чтобы он был последним листом, и я также хочу его переименовать. Для достижения этой цели я делаю это после setDestination() :

 var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheets[0].setName('new name');
SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(sheets[0]);
SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(sheets.length);
 

Но есть проблема getSheets() : похоже, он не обнаруживает прибытие нового листа вовремя, что делает все, что следует за ним, ошибочным.

Я попытался убедиться setDestination() , что перед вызовом завершилось getSheets() выполнение, используя обратный вызов, но это не помогло. Я также пытался поместить

 while(SpreadsheetApp.getActiveSpreadsheet().getSheets().length < numOfSheetsBefore  1){
}
 

блокируйте перед выполнением переименования и перемещения, но это просто заставило мой код работать вечно (тоже для меня загадка).

Итак, мой главный вопрос: почему он не getSheets() знает о новом листе, который был размещен?

Комментарии:

1. Хотя я не уверен в деталях setDestination() , в вашей ситуации, когда SpreadsheetApp.flush() ставится после строки SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(sheets.length 1); , какой результат вы получите? Но когда это не было прямым решением вашей проблемы, я приношу свои извинения за это. В то время, могу ли я спросить вас о деталях setDestination() ?

2. SpreadsheetApp.flush() решил проблему! Я благодарен. К сожалению, я ничего не знаю о setDestination() том, что говорится в ссылке ( developers.google.com/apps-script/reference/forms /… ).

3. Спасибо за ответ. Я рад, что ваша проблема была решена. Кстати, я мог понять setDestination() из вашего ответа. Спасибо и вам.

Ответ №1:

Решение, предложенное Tanaike, состояло в том, чтобы вызвать SpreadsheetApp.flush() after setDestination() , прежде чем приступить к переименованию и перемещению вновь размещенного листа.

Комментарии:

1. В качестве краткого пояснения flush гарантирует, что все ожидающие изменения в электронных таблицах будут применены перед переходом к следующей строке кода, поскольку иногда электронные таблицы заставляют определенные операции выполняться в фоновом режиме при перемещении с остальной частью скрипта (что может вызвать некоторые проблемы с синхронизацией, если вы зависите от этих изменений).