将谷歌电子表格中的批量数据填充到谷歌表单下拉列表中

2024-01-10

我有一个包含多个部分的谷歌表单,每个部分都有一个下拉列表。我希望从电子表格中提取具有匹配名称的下拉列表的数据。

这是我运行的脚本,但它似乎不起作用。

function getDataFromGoogleSheets() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("DATA");
const [header, ...data] = sheet.getDataRange().getDisplayValues();
const choices = {}
header.forEach(function(title, index) {
  choices[title] = data.map(row => row[index]).filter(e => e !== "");
});
return choices;
}

function populateGoogleForms() {
  const GOOGLE_FORM_ID = "1nsDQ6MtdCci-g5XgLxJ-4XNJ19E9sDz42G6DoFLwiFE";
  const googleForm = FormApp.openById(GOOGLE_FORM_ID);
  const items = googleForm.getItems();
  const choices = getDataFromGoogleSheets();
  items.forEach(function(item) {
    const itemTitle = item.getTitle();
    if (itemTitle in choices) {
      const itemType = item.getType();
      switch (itemType) {
        case FormApp.ItemType.CHECKBOX:
          item.asCheckboxItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.LIST:
          item.asListItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.MULTIPLE_CHOICE:
          item.asMultipleChoiceItem().setChoiceValues(choices[itemTitle]);
          break;
        default:
        Logger.log("Ignore question", itemTitle);
       }
    }
  });
}

这是数据的副本:https://docs.google.com/spreadsheets/d/1jfzuVF64QoMIauyFy5Plxv0nQwukf8sMnFXIAyzyK0s/edit#gid=0 https://docs.google.com/spreadsheets/d/1jfzuVF64QoMIauyFy5Plxv0nQwukf8sMnFXIAyzyK0s/edit#gid=0

这是谷歌表格的副本:https://docs.google.com/forms/d/1nsDQ6MtdCci-g5XgLxJ-4XNJ19E9sDz42G6DoFLwiFE/edit https://docs.google.com/forms/d/1nsDQ6MtdCci-g5XgLxJ-4XNJ19E9sDz42G6DoFLwiFE/edit

请帮忙!


我已经有了多项选择表格,所以我只是重命名了标题并生成了一些数据(见下表)。我玩弄了你的代码,因为我从未见过像第四行那样的声明。非常酷,谢谢。我在我手动创建的表单上尝试了您的代码,令我惊讶的是它第一次就成功了。

function getDataFromGoogleSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet1");
  const [hA, ...rows] = sheet.getDataRange().getDisplayValues();
  const cols = {};//just made some minor changes to fit my personal likes in labeling
  const col={};
  const idx={};
  hA.forEach((h, i) => { cols[h] = rows.map(r => r[i]);col[h]=i+1;idx[h]=i; });
  return cols;
}

function populateGoogleForms() {
  const GOOGLE_FORM_ID = getGlobal('formid');//Have the id stored in a spreaddsheet.  Other than that though it's exactly the same code
  const googleForm = FormApp.openById(GOOGLE_FORM_ID);
  const items = googleForm.getItems();
  const choices = getDataFromGoogleSheets();
  items.forEach(function (item) {
    const itemTitle = item.getTitle();
    if (itemTitle in choices) {
      const itemType = item.getType();
      switch (itemType) {
        case FormApp.ItemType.CHECKBOX:
          item.asCheckboxItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.LIST:
          item.asListItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.MULTIPLE_CHOICE:
          item.asMultipleChoiceItem().setChoiceValues(choices[itemTitle]);
          break;
        default:
          Logger.log("Ignore question", itemTitle);
      }
    }
  });
}

数据表:

COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10
0 0 1 2 0 1 2 1 0 0
2 2 2 1 1 2 2 2 2 2
0 1 1 0 0 0 0 0 0 1

填充表格的图像:

我惊讶地发现它会接受你提供的尽可能多的选择。感谢您的代码。

你的最后一个问题涉及到这一行,昨晚我睡觉前一直在思考这个问题,我终于意识到这个额外的过滤器是做什么用的。它适用于那些没有那么多选择的列。我最初不明白这一点,所以我在构建这一行时删除了它:

hA.forEach((h, i) => { cols[h] = rows.map(r => r[i]);col[h]=i+1;idx[h]=i; });

但应该这样做:

hA.forEach((h, i) => { cols[h] = rows.map(r => r[i]).filter(e=>e!=''); });col[h]=i+1;idx[h]=i; });

该过滤器会删除较短列末尾的所有空白。

所以要明确的是,这是最终的解决方案:

代码:

function getDataFromGoogleSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet1");
  const [hA, ...rows] = sheet.getDataRange().getDisplayValues();
  const cols = {};
  const col={};
  const idx={};
  hA.forEach((h, i) => { cols[h] = rows.map(r => r[i]).filter(e=>e);col[h]=i+1;idx[h]=i; });
  return cols;
}

function populateGoogleForms() {
  const GOOGLE_FORM_ID = getGlobal('formid');
  const googleForm = FormApp.openById(GOOGLE_FORM_ID);
  const items = googleForm.getItems();
  const choices = getDataFromGoogleSheets();
  items.forEach(function (item) {
    const itemTitle = item.getTitle();
    if (itemTitle in choices) {
      const itemType = item.getType();
      switch (itemType) {
        case FormApp.ItemType.CHECKBOX:
          item.asCheckboxItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.LIST:
          item.asListItem().setChoiceValues(choices[itemTitle]);
          break;
        case FormApp.ItemType.MULTIPLE_CHOICE:
          item.asMultipleChoiceItem().setChoiceValues(choices[itemTitle]);
          break;
        default:
          Logger.log("Ignore question", itemTitle);
      }
    }
  });
}

这是我这次使用的数据:

COL1 COL2 COL3
10 9 17
18 19 13
14 14 14
3 13
4 7
6
1
8

这是表格:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将谷歌电子表格中的批量数据填充到谷歌表单下拉列表中 的相关文章

  • 使用 Google Advanced Drive 服务通过 Apps 脚本在文件夹中创建新文件

    创建新文件有四种方法 DocsList 显示为DocsList在主列表中 内置于 Apps 脚本中 DriveApp 显示为Drive在主列表中 内置于 Apps 脚本中 驱动器 API 也显示为Drive在主列表中 必须添加到 Apps
  • Google App Script postMessage 与收件人窗口的来源不匹配

    我有一个 Google App 脚本部署为Web应用程序 https developers google com apps script guides web 它工作正常 直到今天晚上我发现它无法在 Firefox 或 Chrome 中加载
  • 将数据从一张纸复制到另一张纸的APP脚本

    我尝试使用此脚本将数据从一张工作表复制到另一张工作表 但是当我更新源工作表中的数据并运行脚本时 整个数据都会被复制 我只想将更新的数据复制到目标工作表而不重叠 谁能建议该怎么做 function copyPaste var ss Sprea
  • 如何使用 Google Apps 脚本将文件夹从我的云端硬盘复制到团队云端硬盘?

    我发现以下 Google Apps 脚本允许我将文件夹从 MyDrive 复制到 MyDrive 以及将 SharedFolders 复制到 MyDrive function start var sourceFolder source va
  • window.location.href = window.location.href 返回空白页

    我正在使用 Google App Script 创建一个网页 单击按钮后 我尝试重新加载页面 但以下操作均无效 窗口 位置 href 窗口 位置 href window location reload true 他们正在重定向到空白页面 下
  • 向文档添加动态页眉/页脚

    我想知道是否有一种方法可以向文档添加动态页眉或页脚 即在页脚中添加每个页面都不同的 页面标题 据我所知 编辑内置页眉或页脚将反映在每个页面上 我想知道是否有人想到了一种解决方法 通过访问页面上的第一行 最后一行并在那里插入文本来 强制 它
  • 如何将值传递到 HTML 模板侧边栏?

    我的任务是更换一些现有的 Access 数据库 我想知道你们是否可以帮助我 目前 我有一个谷歌表格 https docs google com spreadsheets d 1JS5Iwx60Zk7VL8lYz6Yj7ew4eYPhl2Nk
  • Google 文档有内容控制吗?

    我对 Google 文档和内容控制有疑问 如果有的话 我们有一个系统 允许用户设计带有内容控件 rtf 文本 组合框等 的 MS Word 文档 并为控件分配一个 ID 以便我们的系统可以提取 ID 并注册答案 然后数据被保存在数据库中 什
  • 如何让 Google Apps 脚本进行 SHA-256 加密?

    我需要使用文本输入 1 轮 十六进制输出 SHA 256 加密来加密字符串 这应该是一个长度为 64 的字符串 我在 Google Apps 脚本文档中尝试过的每个 SHA 256 加密模块都会返回一组数字 例如 function SHA2
  • 在 Google Apps 脚本中创建插件

    我已经整理了一些我想在其他 Google 工作表中访问的代码 但是 由于它使用 SpreadsheetApp getUi 因此代码必须绑定到工作表 因此 我决定创建代码作为附加组件 不幸的是 除非我打开应用程序脚本页面 否则附加组件不会出现
  • Google Apps 脚本自动生成的库文档

    我目前正在开发一个 Google Apps 脚本库 它基本上将电子表格视为数据库对象 目前 该库有两个相同的功能 例如 Opens and creates a query object for a spreadsheet with the
  • 通过脚本删除工作表

    我正在执行此代码 function deleteSheets var ss SpreadsheetApp getActiveSpreadsheet var sheets ss getSheets var transp ss getSheet
  • 根据条件格式化货币

    Google Apps 脚本新手 但有一些 VBA 编码经验 我希望能够根据不同的单元格输入决定单元格的数字格式 eg Col A 客户名称 验证范围 B 栏 货币类型 英镑 美元 欧元 经过验证的列表 Col C 费用 100 用户免费类
  • 如何从 Google 电子表格中删除项目?

    我通过在脚本编辑器上选择 文件 gt 制作副本 错误地制作了 Google Apps 脚本项目的副本 从那时起 每次我在该项目所属的电子表格屏幕上单击 工具 gt 脚本编辑器 时 我看到显示两个项目 原始项目和复制项目 的屏幕 我需要选择一
  • 如何使 onEdit() 触发函数应用于多个工作表

    我正在处理一张 Google 表格 我有一个脚本可以填充column B当我更新时有时间戳column A在第一个选项卡上 不过 我需要它在第二个选项卡上执行相同的操作 但我无法让它在那里工作 我需要改变什么 我当前使用的脚本是 funct
  • 通过嵌入式 Google Sheet 上的按钮激活脚本

    我正在尝试嵌入一个 Google 电子表格 其中包含一个我希望用户能够激活的脚本 我不希望他们能够编辑页面上的任何内容 我想我可以这样做 共享工作表并设置编辑权限 限制在我想要共享的一张纸上进行编辑 图像位于单元格上方 所以我认为这会阻止人
  • 如果您有多个表单向单个电子表格发送响应,Google 如何知道提交表单时要执行哪个 onsubmit 触发器

    我需要有人澄清 据我了解 多个表单可以将其回复发送到新 Google 表格中的单个电子表格 因此 我创建了两个 Google 表单 并让他们都将回复发送到新的 Google 电子表格 然后我在电子表格 而不是表单 中创建了两个脚本 每个脚本
  • javascript 对象是否像 Ruby 一样“开放”?

    在 Ruby 中 我可以使用与声明自己的语法相同的语法来添加和修改任何类 对象或方法的功能 因为 Ruby 有 开放类 JavaScript 是这样的吗 举个例子 就我而言 我想更改 Google Apps 脚本处理 URL 对象的方式 以
  • 如何修复 OnChange 脚本,该脚本运行良好,但在修改 Google 表格后停止运行

    概述 工作簿根据每条记录的类别分数计算每条记录 或行 的总体分数 类别分数是通过对每个记录的数百个数据点执行的计算得出的 根据我在网上找到的几个示例和教程 我编译了代码以发送名为 checkComplete 的 onChange 电子邮件
  • 仅生成一张电子表格的 PDF

    我需要一个只用一张电子表格创建 PDF 的脚本 我目前有一个生成 PDF 的脚本 但它处理整个文件 我无法将这些值复制到另一个文件 因为我需要导出的工作表是带有从另一个工作表中提取的数据的图形 你可以帮帮我吗 谢谢 function myF

随机推荐

  • tomcat请求的资源()不可用[重复]

    这个问题在这里已经有答案了 我知道这是一个非常常见的问题 因为我在几个论坛中发现了许多与此相关的问题 包括SO 但我还没有找到解决办法 我的 web xml 位于 WEB INF 中
  • 使用下拉列表过滤表(dataTables)

    我正在使用 dataTables jQuery 插件 非常棒 但我无法根据选择框的更改来过滤我的表 功能 document ready function msds table dataTable sPaginationType full n
  • 即使启用了 SSL,Request.URL 也始终返回 http

    我准备了一个 ASP NET Web 应用程序 ASP NET V2 0 并在我的 IIS V7 5 中配置了它 我在我的应用程序中使用了Request Url AbsoluteUri 它在我的服务器中运行良好 我在客户端的服务器计算机 2
  • 找到重叠圆圈的新位置

    我正在尝试编写一个代码 对于给定的圆列表 list1 它能够找到新圆 list2 的位置 list1 和 list2 具有相同的长度 因为对于 list1 中的每个圆 都必须有一个来自 list2 的圆 每对圆 假设 list1 中的 Ci
  • 从插件添加自定义页面模板

    我正在努力构建我的第一个 WordPress 插件 并且需要它为登录屏幕动态添加自定义页面等 我能找到的唯一接近我需要的东西就在这里 WP 使用插件目录中的文件作为自定义页面模板 https stackoverflow com questi
  • 单线程 JavaScript 下的动画

    JavaScript 是一种单线程语言 因此它一次执行一个命令 异步编程是通过以下方式实现的Web APIs 用于事件处理的 DOM 用于 AJAX 调用的 XMLHttpRequest 用于 setTimeout 的 WindowTime
  • 在 Jenkins 中运行 XCodeBuild 时出现代码签名错误

    不重复类似的问题 如下文进一步解释 从 Jenkins 中运行 XCodeBuild 时出现代码签名错误 但它可以从命令行或 Xcode 中构建正常 过去有几个人遇到过这个问题 他们的共同主题是 Jenkins 在启动时作为守护程序用户运行
  • 在 C# 中动态生成委托类型

    我们有一个要求 需要动态生成委托类型 我们需要根据输入参数和输出生成委托 输入和输出都是简单类型 例如 我们需要生成 int Del int int int string and int Del2 int int string int 任何
  • Super POM,Gradle中层次管理的Parent POM类型

    我们目前使用 Maven 作为构建工具 并且有一个迁移到 Gradle 的指令 我们当前的设置是 我们有一个超级 POM 它定义了所有第三方依赖项 各种插件 distributionManagement URL 并且该 POM 已上传到我们
  • 禁用大型项目​​中的组件

    有很多开发人员和初级人员 我想禁用某些组件 例如
  • 如何在 Chrome 浏览器中调试 AngularJS [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在研究 AngularJS 我想在chrome中调试代码 在 Firefox 中 我可以在 Firebug 的帮助下调试它 任何想法 谢
  • Netty-无法访问类 jdk.internal.misc.Unsafe

    当我将 Java 从 8 升级到 11 时 我收到来自 Netty 的错误 jdk internal misc Unsafe 详细信息如下 我知道这是一条调试级别消息 我可以更改日志级别以忽略它 但我不确定当我忽略它时是否会出现其他问题 例
  • 等待多个 Akka FSM 消息

    我有一个 Akka FSM actor 在收到消息后运行以下伪代码ReadyState lookupA Wrapper Lookup A lookupB Wrapper Lookup B lookupC Wrapper Lookup C g
  • 在 Visual Studio 中折叠相关文件

    在 Visual Studio 中 大多数人都会注意到相关文件可以折叠为一个 例如 Form1 cs Form1 Designer cs 我正在创建一个 DAL 库 并将部分类拆分为多个文件 例如 SomeTableClass cs Som
  • windows下“我的电脑”文件夹的路径是什么?

    我正在使用 Visual Studio IDE 开发 C windowsform 项目 我用CFileDialog类要求用户选择要打开的文件 它显示通常打开的文件选择窗口 我希望显示的默认文件夹与单击 我的电脑 时访问的文件夹相同 其中显示
  • Visual Studio 中的引用属性的别名是什么?

    在 Visual Studio 中的 C 项目中 展开 References 文件夹 然后查看任何引用的属性 您会看到 Aliases 属性 在项目中 该属性具有 全局 值 有人可以告诉我这个属性的用途以及如何使用它吗 Thanks 您可能
  • MySQL 扩展显示

    是否有相当于 psql 的 x 来查看新行中每列的记录 Append G到语句末尾而不是分号 SELECT FROM table name WHERE condition G
  • array_multisort():数组大小不一致[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方法在其子数组的基础上对数组进行排序array multisort 功能 在努力的同时 print r mar echo br arr2 array multisort mar array we
  • R 中的 SVM:“预测器必须是数字或有序的。”

    我是 R 新手 遇到了这个问题 我想比较两种预测技术 支持向量机和神经网络 将它们应用于某些数据 并且我想比较它们的性能 为此 我使用 ROC 曲线 该代码应该计算 ROC 曲线下的面积 但它不起作用 神经网络代码工作正常 但是当 SVM
  • 将谷歌电子表格中的批量数据填充到谷歌表单下拉列表中

    我有一个包含多个部分的谷歌表单 每个部分都有一个下拉列表 我希望从电子表格中提取具有匹配名称的下拉列表的数据 这是我运行的脚本 但它似乎不起作用 function getDataFromGoogleSheets const ss Sprea