【问题标题】:How can I populate multiple choice questions in a Google Form from data within a Google Sheet如何从 Google 表格中的数据填充 Google 表单中的多项选择题
【发布时间】:2019-08-08 03:48:45
【问题描述】:

简而言之:我是 Google App Script 的新手,作为一个更大项目的一部分,我希望能够根据存储在 Google 表格中的信息填充 Google 表单中的多项选择项的选项。该表存储了我工作的几位员工的姓名和联系信息。我希望表单列出工作表中个人的姓名,并根据该选择访问其他联系信息,以便稍后进行其他工作。

工作表的示例条目可能是(尽管工作表应该能够包含任意数量的条目(显然从第 2 行开始计数,以忽略标题)):

LNAME    FNAME    ADDRESS             PHONE
Smith    John    123 Sesame Street    (123) 456-7890
Piper    Peter   12 Shore Lane        (098) 765-4321

至于表格,我已经用初始项目填充了它,其中第一个是多项选择项,我希望工作表中的每个名称都有不同的条目(在这种情况下,我需要 2 个条目列出“约翰·史密斯”和“彼得·派珀”)。

将加载这些名称的代码放在表单的 onload() 函数中似乎是合乎逻辑的,因为每次使用时表单都会更新。至于代码,我最初尝试了以下:

function onOpen() {
  // Get a handle for the form itself.
  var form = FormApp.getActiveForm();

  // Who is completing the form?
  var swSheet = SpreadsheetApp.openByUrl("SHEET URL"));
  var sheet = swSheet.getSheetByName("Staff");
  var staff= form.getItems()[0];
  var mcitem = staff.asMultipleChoiceItem();
  mcitem.setChoices([
    mcitem.createChoice(
      mcitem.createChoice(sheet.getRange(2, 2) + " " + sheet.getRange(2, 3)),
    mcitem.createChoice(sheet.getRange(3, 2) + " " + sheet.getRange(3, 3)),
    mcitem.createChoice(sheet.getRange(4, 2) + " " + sheet.getRange(4, 3))
    ]);
}

问题在于我在调用 openByUrl() 时遇到错误(在线搜索显示出于安全原因已弃用此方法)。有一个 IMPORTRANGE() 函数可以为我提取正确的信息,但这似乎只能从工作表中访问,而不能在 Google App 脚本中访问。我也在网上环顾四周,似乎找不到任何其他可以考虑的想法。

注意:我意识到前 3 个条目是硬编码的,而不是无限数量,但这是最终目标。目前我只是想弄清楚如何将信息从工作表中提取到 Google App Script 中。

【问题讨论】:

  • 乔恩,我认为onOpen 不会在你认为的时候运行。 Read the documentation carefully。它说“当用户打开表单进行响应时不会发生此事件,而是当编辑器打开表单进行修改时发生。”似乎您希望表单在每次有人打开它进行响应时“更新自身”?如果您愿意,我建议您通过 web app 创建您自己的自定义表单。
  • onOpen作为触发器的另一个方面是简单的触发器不能访问需要授权的服务。这并不是说您不能将其安装为“可安装”触发器(如果合适的话)。但是,这就是为什么我相信您会收到错误消息。
  • 您说openByUrl() 调用出错(在线搜索显示出于安全原因已弃用此方法)。 openbyURL 包含在documentation 中。请引用您的来源,说明它已被弃用;即使认为陈述可能不准确,这些事情也有滚雪球的趋势。
  • @dwmorrin 我正在考虑一个网络应用程序,但需要为 Google 文档和系统上的文件提供文件选择器(文件上传)。看起来它无法通过网络应用轻松做到这一点,所以我从这里开始。
  • @Tedinoz 抱歉,我有点说错了。对于这种用途,该功能似乎已被弃用:issuetracker.google.com/issues/36762646

标签: google-apps-script google-sheets google-forms


【解决方案1】:

您可以将脚本部署为 Web 应用程序并向表单收件人发送Web App URL,而不是表单链接。每次用户打开 Web 应用 URL 时,表单都会自动更新。

// will be automatically run every time the user opens the URL of the web deployment
function doGet(){
var form = FormApp.openById("FORM ID");
var swSheet = SpreadsheetApp.openByUrl("SHEET URL"));
var sheet = swSheet.getSheetByName("Staff");
var staff= form.getItems()[0];
var mcitem = staff.asMultipleChoiceItem();
mcitem.setChoices([
    mcitem.createChoice(sheet.getRange(2, 2) + " " + sheet.getRange(2, 3)),
    mcitem.createChoice(sheet.getRange(3, 2) + " " + sheet.getRange(3, 3)),
    mcitem.createChoice(sheet.getRange(4, 2) + " " + sheet.getRange(4, 3))
    ]);
// get the link to the form 
var URL=form.getPublishedUrl();
// redirect to the prefilled form URL dynamically created above 
return HtmlService.createHtmlOutput("<script>window.top.location.href=\"" + URL + "\"</script>");
}

【讨论】:

  • 谢谢。我认为网络应用程序将是要走的路。 dwmorrin 对文件的评论应该让我解决所有这些问题。感谢您的所有意见!
  • 很高兴它有帮助!
【解决方案2】:

这是我的建议。这个对我有用;从 Google 工作表中的行和列范围中获取值,并将它们放在 Google 表单多项选择网格问题中:

var form = FormApp.openById('MyForm');
var PtjGridList = form.getItemById(MyFormItemId).asGridItem();
var ss = SpreadsheetApp.openById("MyGoogleSheet");
var PtjNombre = ss.getSheetByName("MyDataSheet");
var RowValues = PtjNombre.getRange(2, 1, PtjNombre.getLastRow() - 1).getValues();
var ValuesRow = [];
for(var i = 0; i < RowValues.length; i++)
if(RowValues[i][0] != "")
ValuesRow[i] = RowValues[i][0];
PtjGridList.setRows(ValuesRow)
var ColumnValues = PtjNombre.getRange(2, 2, PtjNombre.getLastRow() - 1).getValues();
var ValuesColumn = [];
for(var i = 0; i < ColumnValues.length; i++)
if(ColumnValues[i][0] != "")
ValuesColumn[i] = ColumnValues[i][0];
PtjGridList.setColumns(ValuesColumn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多