Forms 有没有一种方法可以基于GoogleSheets数据创建输出表单? 我想做什么

Forms 有没有一种方法可以基于GoogleSheets数据创建输出表单? 我想做什么,forms,google-apps-script,google-sheets,web-applications,Forms,Google Apps Script,Google Sheets,Web Applications,这可能吗? 我想创建一个输出表单,从GoogleSheets电子表格中读取数据。在表单中,用户将输入一些值(例如,输入他们的姓名和一些ID号),并在连接的电子表格中查看相应的信息,但不查看工作表中的任何其他信息。类似于Microsoft Access中的输出表单。我希望有一种方法可以在谷歌表单中使用现有的工具和一些脚本来实现这一点 不过,更一般地说,任何在每个用户的基础上为Google Sheets数据创建这种“有限可见性”的方法都是有用的。(菜单中的“保护工作表”功能无法实现此功能;请参见下文

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

不过,更一般地说,任何在每个用户的基础上为Google Sheets数据创建这种“有限可见性”的方法都是有用的。(菜单中的“保护工作表”功能无法实现此功能;请参见下文。)

作为参考,我目前的具体用例是作为一名教师,希望学生能够从我的学生信息电子表格中看到与他们相关的特定信息,但不透露其他学生的信息。我会有一个简单的表格,他们输入一个名字,或者一些我给他们的个性化代码,这样他们就可以看到他们的出勤记录或其他东西。出于我的目的,我不需要表单非常安全,因为没有一个信息是那么敏感的(虽然更安全更好),但我不想通过让他们访问整个表单而将所有信息放在他们面前

到目前为止我都试过了 我用两张纸制作了一个新的电子表格文件;一张工作表作为表单可见,而第二张工作表不可见(这是我通过“保护”菜单选项实现的)。我使用
importrange()
将主电子表格中的相关数据读入新电子表格的不可见表中。在可见的工作表上,学生从下拉列表中输入姓名,并输入学生ID作为验证。如果学生的姓名和ID匹配,第一张工作表执行
vlookup()
读取受保护工作表中的信息以及学生记录中的一些信息

以下是我所做的,以防我的描述不合情理:

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

小问题是每个学生都能同时看到“表格”。如果两个学生同时打开电子表格,他们将看到其他学生输入的任何信息。我通过编写一个简单的脚本,在20秒后自动重置“表单”的输入单元格来处理这个问题。此外,任何时候当新用户打开表单时,“表单”的输出单元格都会被删除。所以,显然这不是一个很好的解决方案,但就我而言,这基本上已经足够好了

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

您熟悉吗? 应用程序脚本Web应用程序允许您将选定的Google文档内容输出到浏览器中

因此,您可以使用方法
Session.getActiveUser()
获取用户的电子邮件,并动态调整用户将在其电子邮件功能中获取的数据(顺便说一句,您也可以在电子表格中使用
Session.getActiveUser()
,自动检测用户,而不是询问其姓名)

简单工作流示例:

  • 通过学生电子邮件替换A列中的学生姓名(用户用于验证其会话和访问谷歌表单的Gmail地址)
  • 将内容类似于以下内容的脚本绑定到电子表格:
  • 函数doGet(){
    var ss=SpreadsheetApp.getActive().getSheetByName('Data');
    var range=ss.getDataRange();
    var values=range.getValues();
    var user=Session.getActiveUser();
    var输出=”;
    
    对于(var i=1;i同时使用的用户数量有多大潜力?所有的学生都有谷歌账户吗?我对网络应用不是特别熟悉,只是知道它的存在,但根据你概述的内容,我可能知道如何让它工作。知道这是可能的是一个很大的帮助。我非常感谢你。如果我可以问一个问题的话后续问题:
    Session.getActiveUser()
    是否会为每个查看该网页的学生创建不同版本的网页?(如果两个人同时打开该网页,是否对他们两人都有效,或者其中一人是否会看到另一人的信息?)
    也包含在电子表格中,但我很确定不会按每个用户加载电子表格的单独版本。
    Session.getActiveUser()
    将返回登录到浏览器会话的用户-唯一的标准是用户使用相同的(谷歌)登录帐户,作为您电子表格中的电子邮件。换句话说,如果有10个用户打开URL,每个人都会使用自己的设备-每个人的浏览器中都会有不同的文本/html输出结果,没有人会看到实际的电子表格或其他用户的结果。如果此答案对您有帮助,如果可以,请出于文档目的接受答案(✓) - 它还可以帮助将来遇到同样问题的其他人找到解决方案:)
    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));
    }