Google Apps脚本:从私人电子表格中读取

时间:2013-04-21 07:27:55

标签: google-apps-script

我有一个成绩簿网络应用程序脚本,它查看登录学生的电子邮件地址,在成绩簿中查找电子邮件,然后根据电子邮件所在的列显示学生的成绩。唯一的问题是这只适用于spreadhseet是公开的。如何保持spreadhseet私有并仍然使这个脚本工作?我知道,如果我选择“有链接的任何人”,那么有可能找不到电子表格,但我更愿意保持私密状态。此外,从“部署为Web应用程序”界面,应用程序必须以用户身份执行,而不是我自己。有什么想法吗?

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 个答案:

答案 0 :(得分:0)

正如我在您的其他帖子中建议的那样,您可以设置一个手动登录&#39;这将允许您在运行webapp时保持电子表格的私密性。

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

我想保存该列表的最佳位置是以key:value。

的形式出现在脚本属性中

如果你需要更多这个来实现这个解决方案(如果你认为你会这样做的话)随便问。


编辑以下评论:

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

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

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

答案 1 :(得分:0)

从作为用户访问的该服务,通过urlget调用另一个自己发布的应用程序脚本服务。那个人做与ss相关的工作。 可能会在服务电话上获得超时。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我是运行Google Apps for Education套件的域管理员,其中包含许多类似的应用程序。如果您拥有该域名的管理权限,则不提及,但我认为您这样做了吗?

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

我认为您的主要问题源于使用.getEffectiveUser()并不能满足您的需求。我使用Session.getActiveUser.getEmail()然后遍历学生对象(这实际上只是使用标准getRowsData函数作为对象返回的一张学生详细信息)来匹配电子邮件值(如果找不到user = unknown)。

这对我来说非常适合我,学生人数超过2000,所有数据都是私密的,应用程序可快速响应个性化信息。

如果您想看一个示例应用,请告诉我,这里发布的内容有点大。