0

我有一个成绩簿 Web 应用程序脚本,它查看登录的学生的电子邮件地址,在成绩簿中找到电子邮件,然后根据电子邮件所在的列显示学生的成绩。唯一的问题是,这只有在 spreadhseet 是公开。我怎样才能保持电子表格的私密性并且仍然使这个脚本工作?我知道,如果我选择“知道链接的任何人”,则不太可能有人会找到该电子表格,但我希望它保持私密。另外,从“Deploy as Web App”界面来看,应用程序必须以用户身份执行,而不是我自己。有任何想法吗?

var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheet/ccc?key=ID');
var sh1 = ss.getSheetByName('StudentGrades');
var logsheet = ss.getSheetByName('logsheet');
var data = sh1.getDataRange().getValues();
var user = Session.getEffectiveUser()
Logger.log(user)


function doGet() {
       var app = UiApp.createApplication();
       if(!getcol(user)){
          var warn = app.createTextBox().setWidth('500').setValue("Your results are not available or you don't have permission to view these data");// if user is not in the list, warning + return
app.add(warn)
return app
          }
  var grid = app.createGrid(data.length, 2).setWidth('300px').setBorderWidth(1).setCellPadding(0).setCellSpacing(0).setStyleAttribute('borderCollapse','collapse').setId('grid');
       var text = app.createLabel(user).setWidth('300px');
       var col = getcol(user)
       grid.setWidget(0,1,text).setText(0, 0, 'Results for');
       grid.setStyleAttribute('textAlign','center')
       for(n=1;n<data.length;++n){
         grid.setText(n, 0, string(data[n][0]));
         grid.setText(n, 1, string(data[n][col]));
         grid.setStyleAttributes(n-1, 0, {'fontWeight':'bold','background':'#fff','border':'1px solid #000'});//left column css attributes
         grid.setStyleAttributes(n-1, 1, {'fontWeight':'bold','background':'#fff','border':'1px solid #000'});//right column css attributes
       }
       app.add(grid);
       return app
    }

function string(value){
Logger.log(typeof(value))
if (typeof(value)=='string'){return value};// if string then don't do anything
if (typeof(value)=='number'){return Utilities.formatString('%.1f / 20',value)};// if number ther format with 1 decimal
if (typeof(value)=='object'){return Utilities.formatDate(value, Session.getTimeZone(), "MM-dd")};//object >> date in this case, format month/day
return 'error'
}


function getcol(mail){
  if(data[0].toString().indexOf(mail.toString())!=-1){
  for(zz=1;zz<data[0].length;++zz){
    if(data[0][zz] == mail){var colindex=zz;break}
  }
   return colindex
  }
  return false
}
4

4 回答 4

0

正如我在您的另一篇文章中所建议的那样,您可以设置一个“手动登录”,这将允许您在自己运行 web 应用程序时保持电子表格的私密性。

这意味着您必须创建一个用户/密码键/值列表,并且每个学生都必须输入他的用户名和密码(您必须通过电子邮件向他们发送该信息以及指向 webapp 的链接) 在他们访问结果显示部分之前,在前端登录屏幕中。

我想保存该列表的最佳位置是以键:值的形式在脚本属性中。

如果您需要更多这个来实施该解决方案(并且如果您认为您会这样做),请随时询问。


根据您的评论进行编辑

好的,我知道这可能会令人不快:)

只是想知道,将这些数据存储在脚本本身中的脚本数据库中是否更容易您可以使用电子表格值自动更新?更新必须由您执行(或由您创建的计时器触发器执行,以便它在您的帐户上运行),因此电子表格将保持私密。

然后,学生可以使用他们的帐户访问 web 应用程序,而无需访问电子表格。

于 2013-04-21T09:32:50.437 回答
0

从以用户身份访问的服务中,通过 urlget 调用另一个以您自己身份发布的应用程序脚本服务。那个做与ss相关的工作。不过,服务调用可能会超时。

于 2013-04-21T14:27:18.823 回答
0

我是运行 Google Apps for Education 套件的域管理员,其中包含许多类似的应用程序。您没有提及您是否拥有该域的管理权限,但我假设您这样做?

我将所有电子表格保密并以我自己的身份运行网络应用程序(为脚本提供必要的访问权限),我认为这正是您的目标?

我认为您的主要问题源于使用.getEffectiveUser()which 没有为您提供所需的东西。我使用Session.getActiveUser.getEmail()然后遍历学生对象(这实际上只是一张使用标准 getRowsData 函数作为对象返回的学生详细信息)以匹配电子邮件值(如果未找到用户 = 未知)。

这对我来说非常适合拥有超过 2000 名学生,所有数据都是私有的,应用程序响应迅速,提供个性化信息。

如果您想查看示例应用程序,请告诉我,此处发布的内容有点大。

于 2014-04-14T02:05:09.470 回答
0

为什么不为您的每个课程设置一个 google 组?然后将 google 组添加到相应电子表格的 SHARE 权限中。这将有一个额外的好处,允许您通过适当的谷歌组轻松地向您的各个班级发送电子邮件。在这种情况下,您的成绩电子表格将保持私密,只有您和您的 google 群组中列出的电子邮件地址才能访问。

于 2013-05-10T11:41:57.527 回答