有没有一种方法可以根据Google表格数据创建输出表单?

时间:2020-01-01 13:18:26

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

我想做什么

这可能吗?
我想创建一个输出表单,该表单从Google表格电子表格中读取数据。在表格中,用户将输入一些值(例如,输入他们的姓名和一些ID号),并在连接的电子表格中查看相应的信息,但在工作表中则看不到其他任何信息。类似于Microsoft Access中的输出表单。我希望有一种方法可以在Google表格中使用现有工具以及一些脚本来完成此操作。

不过,更一般而言,以每用户为基础为Google表格数据创建这种类型的“有限可见性”的任何方法都是有用的。 (菜单中的“保护纸”功能无法完成此操作;请参见下文。)

作为参考,我目前的特定用例是作为一名老师,并希望让学生从我的学生信息电子表格中查看与他们有关的特定信息,而又不透露其他学生的信息。我将使用一个简单的表单来输入他们的姓名,或者输入一些我提供给他们的个性化代码,以便他们可以看到他们的出勤记录或其他内容。就我的目的而言,我不需要表格非常安全,因为所有信息都不是那么敏感(尽管越安全越好),但我不想只是将所有信息放在它们前面通过授予他们访问整个工作表的权限。

到目前为止我已经尝试过的

我用两张纸制作了一个新的电子表格文件;可以看到一张纸作为表单,而第二张纸则不可见(这是通过“保护”菜单选项完成的)。我使用importrange()从主电子表格中读取相关数据到新电子表格的不可见工作表中。在可见的表格上,学生从下拉菜单中输入他们的姓名,然后输入学生ID作为验证。如果学生的姓名和ID相匹配,则第一张工作表会进行vlookup()读取受保护工作表中的信息以及学生记录中的一些信息。

这是我的作品,以防我的描述不合理:https://drive.google.com/open?id=1cHO2jzMh1mkXvlLh-M4eYqN7v11t95-GnfWqL5IwQ14&authuser=0

这有两个问题,一小一大。

一个小问题是每个学生都可以同时看到“表单”表。如果两个学生同时打开电子表格,他们将看到另一个学生输入的任何信息。我通过编写一个简单的脚本来处理此问题,该脚本在20秒后自动重置“表单”的输入单元格。同样,只要新人打开表格,“表格”的输出单元都会被擦除。因此,显然,这不是一个出色的解决方案,但就我的目的而言,这几乎足够好。

最大的问题是,谷歌自己的预览查看器(内置于Google云端硬盘等)会忽略受保护的范围和工作表,并以电子表格形式显示整个内容。 (通常,受保护的工作表根本不可见,并且除非查看者有权访问,否则它们不会出现在屏幕底部的工作表列表中。)
在我的情况下,这意味着包括一个根本不应该看到的受保护的数据,就像打印预览一样呈现,这意味着学生实际上可以在一个大表中查看其他学生的所有数据。 >

1 个答案:

答案 0 :(得分:0)

您熟悉Web Apps吗?

通过Apps Script Web App,您可以将选定的Google文档内容输出到浏览器中。

在这里,您可以使用方法Session.getActiveUser()获取用户的电子邮件,并根据用户的电子邮件功能动态调整用户要获取的数据(顺便说一句,您也可以使用Session.getActiveUser()在电子表格中,可以自动检测用户,而无需询问他的名字。

简单的示例工作流程:

  1. 通过学生电子邮件(用户用来验证其会话并访问Google表格的Gmail地址)替换A列中的学生姓名
  2. 将具有类似于以下内容的脚本绑定到电子表格:
function doGet(){
  var ss=SpreadsheetApp.getActive().getSheetByName('Data');
  var range=ss.getDataRange();
  var values=range.getValues();
  var user=Session.getActiveUser(); 
  var output="";
    for(var i=1;i<ss.getLastRow();i++){
      if(values[i][0]==user){
        for(var j=1;j<ss.getLastColumn();j++){
          output+=(values[i][j])+" ";
       }
     }
  }
  return ContentService.createTextOutput(JSON.stringify(output));
}

确保您具有doGet()函数和一条return语句。

  1. 手动运行一次脚本以触发授权流后,将其部署为Web App-以User accessing the web app身份执行并授予对Anyone的访问权限(除非另有需要)。
  2. 复制WebApp的URL并将其转发给您的学生。
  3. 如果学生在工作表中列出了他们的电子邮件,则当他们在浏览器中打开URL时,他们将获得结果。

请注意,提供的代码是一个简单的示例,该示例检索 所有数据并以字符串形式输出。随时修改脚本 例如仅检索感兴趣的列并将数据输出为 html表,而不是简单的字符串。