【问题标题】:Populate Google Form using Google App Script on Form open在表单打开时使用 Google App 脚本填充 Google 表单
【发布时间】:2020-08-26 13:59:44
【问题描述】:

我有一个谷歌表单,当用户打开表单时,我想在其中填充电子表格中的一些数据。

我有一个 ListItem,我用电子表格数据填充它。直到现在我都使用了 Open(e) 函数和一个触发器,但我发现这个方法只在表单编辑时触发,而不是在表单打开时触发。

你知道我该怎么做吗?

要知道我想要什么,我有两个文件,Code.gs 包含主要功能,如 onOpenonFormSubmit,和 ItemClass,我在其中获取数据并创建 UI。

我将控制台日志设置为 Open(e) 功能,但从未触发。

代码.gs

function onOpen(e) {
  console.log({message: 'onOpen', initialData: e});
  let items = getItems();
  
  let form = FormApp.openById(PARAMS.formID);
  
  form.setTitle('New Form')
  
  createUI(form, items);
}

ItemsClass.gs

function getItems() {
  var email = Session.getActiveUser().getEmail();
  
  var allItems = SpreadsheetApp.openByUrl(PARAMS.sheetURL).getSheetByName("Items Stream").getDataRange().getDisplayValues();
  
  var headers = allItems.shift();
  
  var items = new Array;
  for (var i = 0; i < allItems.length; i++) {
      var first = allItems[i][1]
      var second = allItems[i][2]
      items.push(first + "&" + second)
  }
   return items;
}

【问题讨论】:

  • 当您作为表单创建者打开表单编辑器时,表单的onOpen 触发器起作用,而不是当用户打开他填写并提交的表单时。如果您更详细地解释为什么要在onOpen 上运行该表单,您可能会想出一种解决方法。您是否希望每次用户填写表单时内容都会发生变化?
  • 每当用户打开表单时,我希望他看到从电子表格中获取的一些事件,并且他可以从那里修改这些事件并在提交时在电子表格中修改它们
  • 如果您希望每次用户打开要填写的表单时更新表单内容 - 这对于 Google 表单是不可能的。您也可以使用网络投票创建自定义 HTML - 如果您有兴趣,我可以发布示例!
  • 是的,当然!谢谢你:)

标签: google-apps-script web-applications


【解决方案1】:

on Open 触发器 Google 表单仅在打开表单编辑器时起作用,而不是用户填写的实际表单

要在用户打开表单时返回更新的数据并允许他修改数据,您应该使用Web polling 创建一个自定义 HTML 表单。

  • 使用setInterval 的网络轮询允许从电子表格中提取新数据并以指定的时间间隔对其进行更新
  • Apps Script WebApps 允许您将 Apps Script 和 HTML/Javascript 结合起来,从而使您可以轻松地在服务器端和 UI 之间进行交互 - 对于创建自定义 HTML 表单很有用
  • 使用google.script.run进行双方通信。

从电子表格的 A 列中提取更新数据并允许用户修改值的简单示例:

code.gs:

var sheet = SpreadsheetApp.openById('XXX').getSheetByName("YYY");

function doGet(){
  var html=HtmlService.createTemplateFromFile('index');
  return html.evaluate();
}
function getValues() {
  //get data from the first column
  var data = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
  var table = "";
  for (var i = 0; i < data.length; i++) {
    table +='<tr><td>' + data[i][0] + ' </td><tr>';
  }
  return table;
}
function writeToSheet(newValues) {
  newValues = newValues.split(",");
  var range = sheet.getRange(1, 1, newValues.length, 1);  
  newValues = newValues.map(function(row){return [row]});
  range.setValues(newValues);
}

index.html:

<!DOCTYPE html>
<html>
   <head>
      <base target="_top">
   </head>
   <script>
      function onSuccess(values){
        document.getElementById("data").innerHTML=values;
      }
      function polling(){
//modify the interval of 2000 ms to any desired value
        setInterval( function(){google.script.run.withSuccessHandler(onSuccess).getValues()},2000);
       }
      function updateValues(){
        var newValues= document.getElementById("newValues").value;
        google.script.run.writeToSheet(newValues);        
      }       
   </script>
   <body onload="polling()">
      <div> Values: </div>
      <table id="data">
      </table>
      <div> If you want to modify the values in the spreadsheet, type in new values comma separated: </div>
      <input type="text" id="newValues" ><br><br>
      <input type="button" value="Confirm" onclick="updateValues()">
   </body>
</html>

部署此 WebApp 并在 documentation 中描述,并将 WebApp URL 粘贴到浏览器地址栏中。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多