Одна форма Google для нескольких листов


Из-за продолжающейся разработки версий, а также, казалось бы, непреодолимых проблем реализации разрешений пользователей обходные пути, мне нужно захватить данные формы, связанные с листом, который не является exposd для пользователей. Вместо этого я хочу запустить форму из отдельного приложения электронной таблицы с помощью пользовательского меню. И все же, несмотря на тщательные поиски в Google и дразнящее название 'FormApp.способ openById, я не могу найти способ, чтобы достичь этого.

Я знаю, что сбился с пути; может кто-нибудь указать мне на путь назад?

1 3

1 ответ:

Шаг 1: Создание Формы

Обычная рабочая процедура-создайте свою форму либо с помощью скрипта, либо с помощью пользовательского интерфейса Forms. Захватите идентификатор формы. Например, из URL-адреса в Редакторе:

https://docs.google.com/forms/d/1-AWccGNgdJ7_5Isjer5K816UKNSaUPSlvlkY3dGJ1UQ/edit
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Прикрепите электронную таблицу для записи ответов. (Мы больше ничего не будем делать с этим здесь.)

Шаг 2: Клиентский Скрипт

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

/**
 * Uses the Forms service to get a handle on an existing form, then retrieve its published URL.
 * Uses the UrlFetch Service to get a copy of the HTML for the form.
 * Uses the HtmlService to embed the form's HTML in a Spreadsheet UI.
 * ... which is finally shown using Spreadsheet.show().
 */
function launchForm() {
  var formID = '1-AWccGNgdJ7_5Isjer5K816UKNSaUPSlvlkY3dGJ1UQ';
  var form = FormApp.openById(formID);
  var formUrl = form.getPublishedUrl();

  var response = UrlFetchApp.fetch(formUrl);
  var formHtml = response.getContentText();

  var htmlApp = HtmlService
      .createHtmlOutput(formHtml)
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle('Ta Daaa!')
      .setWidth(500) 
      .setHeight(450);

  SpreadsheetApp.getActiveSpreadsheet().show(htmlApp);
}

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Launch Form",
    functionName : "launchForm"
  }];
  sheet.addMenu("Custom Menu", entries);
};

Демо

Вот что вы видите, когда выбираете "запустить форму" из "пользовательского меню". Однако есть одна маленькая неприятность-когда форма отправлена, пользователь переходит в другое окно браузера или на другую вкладку. В электронной таблице пользовательский интерфейс остается открытым и должен быть закрыт вручную. эта проблема исчезла с iframe sandboxing!

Скриншот-встроенная форма


EDIT: изменения в Недавно были введены значения по умолчанию для песочницы ECMA, которые требуют, чтобы режим песочницы был явно установлен в NATIVE для работы этого метода. Код был обновлен.

Изменить снова: новый режим песочницы IFRAME сохраняет весь опыт формы внутри диалогового окна.