Совместное использование одной и той же формы Google в нескольких таблицах

Я создал форму обратной связи и хочу открыть ее и поделиться ею с несколькими электронными таблицами. Я использовал исправленную версию кода в следующем сообщении Single Google Form для нескольких листов.

Форма открывается, как и ожидалось, как IFRAME, но не позволяет мне (или любому пользователю) заполнять поля и создавать ответ. Что мне не хватает?

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('Data Architecture')
      .addItem('Create File Note', 'menuItem1')
      .addSeparator()
      .addSubMenu(ui.createMenu('Feedback & Actions')
          .addItem('Provide  Feedback', 'provideFeedback')
          .addItem('Create and Action', 'createAction'))        
      .addToUi();
}

function provideFeedback() {
  
  var documentName = SpreadsheetApp.getActive().getName();
  
  var dataentityName = SpreadsheetApp.getActiveRange().getCell(1, 1).getDisplayValue();
  
  launchForm();
  
  
}

function createAction() {
  
  var documentName = SpreadsheetApp.getActive().getName()
  
  var documentID = SpreadsheetApp.getActive().getId()
  
  var dataentityName = SpreadsheetApp.getActiveRange().getCell(1, 1).getDisplayValue()
  
  launchForm();
  
}

function launchForm(){

  var formID='1pmH3AWiMUczat5uIaZ5zaT--cmDjq9v3W9pePPjwGF0';
  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('Feedback and action form')
  .setWidth(800)
  .setHeight(800);
  
  SpreadsheetApp.getActiveSpreadsheet().show(htmlApp);
}


person M Vega    schedule 09.05.2017    source источник
comment
Было бы полезно поделиться частью кода, который вы используете для отображения формы.   -  person Jack Brown    schedule 09.05.2017
comment
Я добавил код в исходный пост.   -  person M Vega    schedule 09.05.2017


Ответы (1)


Вместо того, чтобы обращаться к веб-странице, генерировать HTML-контент и обслуживать его снова, вы можете использовать тег iframe с src для своего URL-адреса, чтобы сделать это за вас.

function launchForm(){

  var formID='1pmH3AWiMUczat5uIaZ5zaT--cmDjq9v3W9pePPjwGF0';
  var form = FormApp.openById(formID);
  var formURL = form.getPublishedUrl()+ "?embedded=true" 

  var htmlApp = HtmlService
  .createHtmlOutput('<iframe src="'+formURL+'" width="500" height="400" frameborder="0" marginheight="0" marginwidth="0"> </iframe>')
  .setTitle('Feedback and action form')
  .setWidth(400)
  .setHeight(400);

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

Чтобы использовать предварительно заполненную форму в сценарии:
1) Получите предварительно заполненную форму, выполнив следующие действия здесь
2) Для такой формы:

введите здесь описание изображения предварительно заполненный URL будет выглядеть так :

var formURL = "https://docs.google.com/forms/d/e/{Publish ID}/viewform?
usp=pp_url&
entry.1739076204=Jack+Brown&
entry.1869878870=2017-05-12&
entry.799903038=Incorrect&
entry.1996064114=I+am+the+best&
entry.607023772=Select+Me"

Я выделил отдельные параметры, чтобы их было легче сравнивать с записью в форме. Теперь, чтобы изменить запись, все, что вам нужно сделать, это изменить значение после знака «=» для каждой записи. Итак, чтобы изменить имя, которое вы должны сделать:

var name = "Chuck Norris"
entry.1739076204='+name+'

Точно так же вы можете изменить каждый ввод, изменив URL-адрес. Приведенный ниже код изменяет запись для конкретной формы, которую я разместил. Вам придется изменить, если в соответствии с вашими потребностями

 function launchForm(){

  var publishedURl = "https://docs.google.com/forms/d/e/1FAIpQLSdsHM53jTWJ0Eqn8VSxE5bWHjnD9KXsVBrqLsBwtyJIIsjpnA/viewform"
  var name = "Chuck Not Norris"
  var dt = Utilities.formatDate(new Date(), "GMT-05:00", "yyyy-MM-dd")
  var options1 = ["Correct","Incorrect"]
  var options2 = "Chuck Norris is google Apps Scripts"
  var options3 = ["Select Me","Don't select me"]
  var preEditUrl = publishedURl + '?usp=pp_url&entry.1739076204='+name
                   +'&entry.1869878870='+dt
                   +'&entry.799903038='+options1[0]
                   +'&entry.1996064114='+options2
                   +'&entry.607023772='+options3[0]

  var htmlApp = HtmlService
  .createHtmlOutput('<iframe src="'+preEditUrl+'" width="500" height="400" frameborder="0" marginheight="0" marginwidth="0"> </iframe>')
  .setTitle('Feedback and action form')
  .setWidth(400)
  .setHeight(400);

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

Надеюсь, это поможет вам начать в правильном направлении.

person Jack Brown    schedule 09.05.2017
comment
Это работает, большое спасибо; очень признателен. Единственный оставшийся вопрос заключается в том, как предварительно заполнить определенные поля, когда форма открывается в IFRAME, например, адрес электронной почты пользователя, создающего ответ, значение поля даты по умолчанию для текущей даты и 3 параметра, переданные от вызывающей стороны. - person M Vega; 10.05.2017
comment
@MVega Обновлен ответ, чтобы объяснить, как предварительно заполнить поле. - person Jack Brown; 10.05.2017