Форма ответов spreadsheet.getSheets () не возвращает лист ответов? - PullRequest
0 голосов
/ 02 августа 2020

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

  // ...

  // Copy the existing answers to a new sheet in the spreadsheet and rename it
  // with this week's DateTime.
  today = Utilities.formatDate(new Date(), 'GMT', 'dd/MM/yyyy HH:mm');
  currentSheet.copyTo(spreadsheet).setName(today);

  // Delete the form responses from the Form. This will _not_ update the
  // responses Spreadsheet.
  form = FormApp.openByUrl(spreadsheet.getFormUrl());
  form.deleteAllResponses();

  // Begin dodgy hack
  // First unlink the Form from the responses Spreadsheet
  form.removeDestination();

  // Delete the old responses Sheet
  console.log(`Removing the ${CURRENT_SHEET_NAME} sheet`);
  spreadsheet.deleteSheet(currentSheet);

  // Relink the existing responses Spreadsheet to the Form
  form.setDestination(FormApp.DestinationType.SPREADSHEET, SPREADSHEET_ID);

  // It's not possible to get a handle on the sheet the responses will be put
  // into from Form or FormApp, so there are two choices: iterate through 
  // the sheets and find one with the correct FormUrl, or hope that for
  // all eternity, Google Apps Scripts will add new sheets at the zeroth index.
  const formId = form.getId();

  // **MADNESS**: only the renamed sheet comes back from getSheets. In the
  // Spreadsheet UI there is now two sheets: `Form Responses N` and `today`
  // where N is the ridiculous number of times I've tried to run this script
  // and Today is the current DateTime.
  spreadsheet.getSheets().forEach((sheet) => console.log(sheet.getName()));

  // Below is the intended, currently non-functional, behaviour
  const newCurrentSheet = spreadsheet.getSheets().find((sheet) => {
     return (url && url.indexOf(formId) > -1);
  });

  newCurrentSheet.setName(CURRENT_SHEET_NAME);

Я пробовал следующее, ни один из который работал:

  • Использование getDestinationId в форме и повторная выборка электронной таблицы с помощью SpreadsheetApp.openById перед запуском getSheets
  • Использование Utilities.sleep в течение 5 секунд (произвольное число) после работает .setDestination, чтобы дать API время на выполнение / обдумывание.

Этот ощущается как ошибка, но, возможно, есть другой способ получить «обновленное» представление электронной таблицы после повторной ссылки на форму? Или я пропустил что-то действительно очевидное (вероятно).

1 Ответ

2 голосов
/ 02 августа 2020

Весьма вероятно, что ваш скрипт не получает лист ответов на новую форму, потому что он отсутствует SpreadsheetApp.flush() после добавления этого листа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...