Могу ли я скопировать скрипт из формы в связанную электронную таблицу? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть шаблон формы, который я буду дублировать по мере необходимости, изменять и рассылать для ответов.Я написал скрипт для электронной таблицы связанных ответов, который определенным образом реорганизует данные ответов.Сам скрипт работает нормально, и его нужно запускать только на моем аккаунте.

Проблема в том, что скрипт привязан к электронной таблице, а не к форме;но дублируется форма, а не электронная таблица.Я попытался связать свой сценарий с шаблоном формы и использовать приведенный ниже код для создания связанной электронной таблицы и копирования сценария.Я настроил триггер для запуска этой функции при отправке формы, но триггер исчезает, когда шаблон формы дублируется.Этот код в значительной степени скопирован из этого ответа: https://stackoverflow.com/a/48353155/12131953 с несколькими строками, добавленными в начале для создания связанной электронной таблицы.

function copyScript() {
  //create destination spreadsheet
  var form = FormApp.getActiveForm();
  var ss = SpreadsheetApp.create(form.getTitle() + " (Responses)");
  form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());

  var srcProjectId = "###my project id###"; // Source project ID
  var dstGoogleDocsId = ss.getId(); // Destination spreadsheet ID

  var baseUrl = "https://script.googleapis.com/v1/projects";
  var accessToken = ScriptApp.getOAuthToken();

  // Retrieve filename of bound-script project.
  var srcName = JSON.parse(UrlFetchApp.fetch(baseUrl + "/" + srcProjectId, {
    method: "get",
    headers: {"Authorization": "Bearer " + accessToken}
  }).getContentText()).title;

  // Retrieve bound-script project.
  var obj = UrlFetchApp.fetch(baseUrl + "/" + srcProjectId + "/content", {
    method: "get",
    headers: {"Authorization": "Bearer " + accessToken}
  }).getContentText();

  // Create new bound script and retrieve project ID.
  var dstId = JSON.parse(UrlFetchApp.fetch(baseUrl, {
    method: "post",
    contentType: 'application/json',
    headers: {"Authorization": "Bearer " + accessToken},
    payload: JSON.stringify({"title": srcName, "parentId": dstGoogleDocsId})
  }).getContentText()).scriptId;

  // Upload a project to bound-script project.
  var res = JSON.parse(UrlFetchApp.fetch(baseUrl + "/" + dstId + "/content", {
    method: "put",
    contentType: 'application/json',
    headers: {"Authorization": "Bearer " + accessToken},
    payload: obj
  }).getContentText());
}

Затем я попытался программно создать триггер при дублировании формыоткрыт, но, насколько я могу судить, создание устанавливаемых триггеров находится за пределами полномочий простого триггера onOpen.

function onOpen(); {
   ScriptApp.newTrigger("copyScript").forForm(FormApp.getActiveForm()).onFormSubmit().create();
.
.
.
}

Я не являюсь разработчиком и самоучка этому делу;Я довольно хорошо разбираюсь в аспекте сценариев, но совсем не знаком с API и веб-развертываниями.

Поэтому мой вопрос: Есть ли способ скопировать скрипт в новый, связанный с формойэлектронная таблица из формы? Я также согласен с решением, которое каким-то образом применяет мой скрипт (может быть, как отдельный) ко всем новым электронным таблицам, потому что код создает пункт меню;поэтому сделать сценарий дополнением может быть ответом здесь, но это кажется излишним для сценария, который может запустить только один человек.

1 Ответ

0 голосов
/ 30 сентября 2019

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

function onOpen() {
  FormApp.getActiveForm().setDestination(FormApp.DestinationType.SPREADSHEET, 'ID of your destination spreadsheet'); 
}
  • Запустите этот скрипт один раз вручную, чтобыдать необходимые разрешения сценарию
  • Скопируйте вашу форму столько, сколько вам нужно - каждая копия будет содержать копию сценария
  • Сценарий запустится onFormOpen и установит destination соответствующей копии формы в одну и ту же электронную таблицу - ту, в которой содержится сценарий реорганизации
  • Ответы форм из разных форм будут автоматически вставляться в разные листы электронной таблицы
...