#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 гарантирует, что все ожидающие изменения в электронных таблицах будут применены перед переходом к следующей строке кода, поскольку иногда электронные таблицы заставляют определенные операции выполняться в фоновом режиме при перемещении с остальной частью скрипта (что может вызвать некоторые проблемы с синхронизацией, если вы зависите от этих изменений).