如何预填写 Google 表单复选框?

2024-04-24

我看过这个问题“是否可以使用谷歌电子表格中的数据“预填写”谷歌表单? https://stackoverflow.com/questions/20108511/is-it-possible-to-prefill-a-google-form-using-data-from-a-google-spreadsheet”并且答案中提供的代码(感谢 Mogsdad)非常适合文本类型的 Google 表单问题。我的问题是: 是否可以预先填写复选框类型的 Google 表单问题?

例如,如果我有一个现有的电子表格,其中包含“姓名”条目,并且其中一个条目是“Fred,Barney”,是否可以通过编码预先填写一份表格,其中勾选了“Fred”和“ Barney”在“姓名”复选框下键入 Google 表单问题?

谢谢, 格雷格


对于大多数其他类型,每个响应的基本模式都可以重复。例如,这适用于多项选择:

            item = items[i].asMultipleChoiceItem();
            var respItem = item.createResponse(resp);

然而,复选框可能很棘手,因为它可能有一个项目、多个项目,甚至“其他”响应。当响应记录到电子表格中时,它将显示为以逗号分隔的字符串;当在表单提交事件中(例如在触发器函数中)收到时,我们得到一个数组(...其中所有响应都位于数组的第一项中,以逗号分隔的字符串形式)。这createResponse()checkboxItem 的方法需要一组有效的选择...所以我们可以用一点 JavaScript 魔法来提供它:

            item = items[i].asCheckboxItem();
            // Response is a CSV string, need array
            var respArray = resp.split(/ *, */);
            var respItem = item.createResponse(respArray);

EDIT:当启用“其他”选项时,Google 存在 CheckboxItems 和 MultipleChoiceItems 的错误。这些“其他”选项是允许的,但在预填充的 URL 中渲染不正确,因此它们不会出现在显示的表单中。请查看并加星标问题 4454 https://code.google.com/p/google-apps-script-issues/issues/detail?id=4454.

这是该函数的更新版本是否可以使用谷歌电子表格中的数据“预填写”谷歌表单? https://stackoverflow.com/questions/20108511/is-it-possible-to-prefill-a-google-form-using-data-from-a-google-spreadsheet/20110656#20110656,更新为处理列表、多项选择和复选框响应。这个版本更通用,它可以适应电子表格中的标题。BONUS:如果您添加标有“预填充 URL”的列,脚本将在其中写入其生成的 URL。

/**
 * Use Form API to generate pre-filled form URLs
 * 
 * https://stackoverflow.com/a/26395487/1677912
 */
function evenBetterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Form Responses 1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill
  var headers = data[0];                     // Sheet headers == form titles (questions)

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();
  var urlCol = headers.indexOf("Prefilled URL");   // If there is a column labeled this way, we'll update it

  // Skip headers, then build URLs for each row in Sheet1.
  for (var row = 1; row < data.length; row++ ) {
    Logger.log("Generating pre-filled URL from spreadsheet for row="+row);
    // build a response from spreadsheet info.
    var response = form.createResponse();
    for (var i=0; i<items.length; i++) {
      var ques = items[i].getTitle();           // Get text of question for item
      var quesCol = headers.indexOf(ques);      // Get col index that contains this question
      var resp = ques ? data[row][quesCol] : "";
      var type = items[i].getType().toString();
      Logger.log("Question='"+ques+"', resp='"+resp+"' type:"+type);
      // Need to treat every type of answer as its specific type.
      switch (items[i].getType()) {
        case FormApp.ItemType.TEXT:
          var item = items[i].asTextItem();
          break;
        case FormApp.ItemType.PARAGRAPH_TEXT: 
          item = items[i].asParagraphTextItem();
          break;
        case FormApp.ItemType.LIST:
          item = items[i].asListItem();
          break;
        case FormApp.ItemType.MULTIPLE_CHOICE:
          item = items[i].asMultipleChoiceItem();
          break;
        case FormApp.ItemType.CHECKBOX:
          item = items[i].asCheckboxItem();
          // In a form submission event, resp is an array, containing CSV strings. Join into 1 string.
          // In spreadsheet, just CSV string. Convert to array of separate choices, ready for createResponse().
          if (typeof resp !== 'string')
            resp = resp.join(',');      // Convert array to CSV
          resp = resp.split(/ *, */);   // Convert CSV to array
          break;
        case FormApp.ItemType.DATE:
          item = items[i].asDateItem();
          resp = new Date( resp );
          resp.setDate(resp.getDate()+1);
          break;
        case FormApp.ItemType.DATETIME:
          item = items[i].asDateTimeItem();
          resp = new Date( resp );
          break;
        default:
          item = null;  // Not handling DURATION, GRID, IMAGE, PAGE_BREAK, SCALE, SECTION_HEADER, TIME
          break;
      }
      // Add this answer to our pre-filled URL
      if (item) {
      // Checking if there is any value
        if(resp[0].length != 0){
          var respItem = item.createResponse(resp);
          response.withItemResponse(respItem);
        }
      }
      // else if we have any other type of response, we'll skip it
      else Logger.log("Skipping i="+i+", question="+ques+" type:"+type);
    }
    // Generate the pre-filled URL for this row
    var editResponseUrl = response.toPrefilledUrl();
    // If there is a "Prefilled URL" column, update it
    if (urlCol >= 0) {
      var urlRange = sheet.getRange(row+1,urlCol+1).setValue(editResponseUrl);
    }
  }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何预填写 Google 表单复选框? 的相关文章

随机推荐

  • 使用新文件名保存文件:附加到现有文件名

    有没有一种简单的方法 在 VIM 中 使用当前名称加上附加短语保存当前打开的文件 即 来自 home affert type vim data folder file1 txt 然后将文件另存为 data folder file1 txt
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 反序列化通用列表返回 null

    我正在反 序列化一个对象 如下所示 public class myClass ISerializable public List
  • 跨浏览器高度 100%(变换比例<1)

    我似乎无法找到一种方法使子容器的高度为父容器的 100 并且只能看到滚动条 相反 我们看到高度的空白量增加了一倍 这个问题与Javascript 放大 缩小到鼠标 x y 坐标 https stackoverflow com questio
  • 获取函数/类构造函数的参数类型

    我正在尝试做一些我不确定在 TypeScript 中是否可行的事情 从函数推断参数类型 返回类型 例如 function foo a string b number return a b type typeA
  • Visual Studio 2013 自动套用格式 (CTRL K D) cshtml 小写问题

    我最近才更新到 VS 2013 当使用 MVC 3 应用程序时 我遇到了自动格式化问题 即使用 CTRL K D 快捷键 或突出显示全部 格式选择 例如 model IEnumerable
  • pytesseract 无法按预期识别文本?

    我正在尝试通过 opencv 和 pytesseract 运行一个简单的车牌图像来获取文本 但我无法从中获取任何内容 按照此处的教程进行操作 https Circuitdigest com microcontroller projects
  • 如何从控制器调用构造函数中具有参数(接口)的属性

    public class HMACAuthenticationAttribute Attribute IAsyncAuthorizationFilter public HMACAuthenticationAttribute IUser us
  • Couchbase 无法 MutateIn 多个带有 null 值的 upserts

    我有一个 Couchbase 文档 我想在一次调用中改变多个属性 如果其中一个属性值为 null 则 mutate 会失败并显示以下消息 KV错误 名称 EINVAL 描述 无效数据包 属性 内部 无效输入 和状态 Couchbase IO
  • 如何在滚动 iPhone 上向 tableview 添加元素?

    我正在使用 UITableView 列出来自 Web 服务的元素 我需要做的是首先从Web服务调用20个元素并显示在列表中 当用户向下滚动时从Web服务调用另外20个记录并添加到表格视图 这个怎么做 您可以从 Web 服务加载 20 个项目
  • 如何防止视图将其模型传递给部分视图,而是传递 null?

    在 ASP NET MVC 和使用 Razor 中 我有一个视图 父视图 调用另一个视图 子视图 作为部分视图 两者都是强类型的 但它们具有不同的模型类型 通常 在这些情况下 我们会显式地将模型从父视图传递到子视图 Html Partial
  • 光标在 Google 地图应用程序中消失

    这确实很奇怪 使用 API v3 创建 Google 地图应用程序后 有时当我将光标悬停在地图上时 鼠标光标会消失 我需要与地图之外的几个控件进行交互 当我点击其中一个并且地图失去焦点后 问题就显现出来了 这事发生在别人身上过吗 我尝试将焦
  • 如何在 Bootstrap 中水平居中表格

    这是我的代码 我想做的是将这张桌子放在容器的中心 但相反 当我使用 容器 类时 它默认向左对齐 并且当我对 div 使用 容器流体类 时 它使用全宽度 我想将桌子水平居中 有人可以帮忙吗 div class container fluid
  • NaN 是假的吗?为什么 NaN === false 返回 false

    Why NaN false gt false NaN 不是假吗 Why NaN NaN gt 错误 但是 NaN NaN gt 正确 我绞尽脑汁想弄清楚这个问题 Falsy并且严格等于false是非常不同的事情 这就是为什么一个人有一个y而
  • 条件“可浏览”属性

    有没有办法使 可浏览 属性成为有条件的 以便应用它的属性有时会出现在属性页中 有时不会出现 谢谢 我不确定这是否适用于您的情况 但您可以通过调用下面的函数在运行时调整 可浏览 装饰
  • Mysql 客户端使用 `docker-compose run` 与 `docker-compose exec` 调用

    为什么调用时需要指定主机docker compose run e g docker compose run db container mysql uuser ppass db name h db container 似乎直接相当于 dock
  • 将 CSV 文件拆分为较小的文件但保留标题?

    我有一个巨大的 CSV 文件 有 100 万行 我想知道是否有一种方法可以将此文件拆分为较小的文件 但保留所有文件的第一行 CSV 标题 它似乎split速度非常快 但也非常有限 您不能向文件名添加后缀 例如 csv split l1100
  • 如何处理 Akka 子 actor 的长时间初始化?

    我有一个演员 它创建一个子演员来执行一些冗长的计算 问题是子 Actor 的初始化需要几秒钟 并且父 Actor 在子 Actor 创建和完全初始化之间发送给子 Actor 的所有消息都将被丢弃 这是我正在使用的代码的逻辑 class Ch
  • TypeScript 类型的并集被解析为类型的交集

    我有这个片段 class J constructor public foo number class B constructor public bar string interface Cache json J binary B funct
  • 如何预填写 Google 表单复选框?

    我看过这个问题 是否可以使用谷歌电子表格中的数据 预填写 谷歌表单 https stackoverflow com questions 20108511 is it possible to prefill a google form usi