2013-04-21 124 views
0

读我有一个成绩册web应用程序脚本,它着眼于学生的电子邮件地址的记录,找到的电子邮件中的成绩簿,然后显示基于列的电子邮件是在学生的成绩。唯一的问题是,这只有当传播者被公开时才有效。我怎样才能保持传播私密性,并仍然使这个剧本工作?我知道,如果我选择“有链接的任何人”,不太可能有人会找到电子表格,但我宁愿将其保留为私人。另外,从“部署为Web应用程序”界面,该应用程序必须以用户身份执行,而不是自己执行。有任何想法吗?谷歌Apps脚本:从私人电子表格

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 
} 

回答

0

正如我所建议的另一个自己的帖子你可以设置一个“手动登录”,将让你保持电子表格私人,同时运行在Web应用自己。

这意味着,你必须创建用户名/密码键/值的列表,每个学生必须输入自己的用户名和密码(你必须通过电子邮件发送这些信息与一起链接到Web应用程序),然后才能访问结果显示部分。

我猜认为,名单是在关键的形式脚本性能最好的地方:值。

如果您需要更多,这对实现该溶液(如果你认为你会走那条路)随意问。


编辑您的评论如下:

好吧,我理解它可以是不愉快:)

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

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

+0

我感谢你的帮助(你可以在上面看到我如何修改你的脚本)。每学期我将使用至少有5个不同班级的成绩簿。使用用户名和密码进行额外的登录过程将非常不方便。必须有另一种方式来做到这一点。什么与oAuth? – Acornrevolution 2013-04-21 12:59:03

+0

我明白...看到编辑另一个可能的解决方案。 – 2013-04-21 15:10:43

0

从作为用户访问的服务开始,通过urlget调用另一个作为自己发布的应用脚本服务。那个人做与ss有关的工作。 虽然服务电话可能会超时。

0

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

+0

这实际上会共享电子表格/成绩簿,我想完全避免这种情况。分享它会给他们至少观看权利。 – Acornrevolution 2014-04-22 12:47:46

0

我运行的是谷歌Apps for Education的套房,在许多地方类似的应用程序域管理员。您没有提及您是否拥有该域的管理权限,但我认为您会这样做?

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

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

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

如果你想看到一个示例应用程序,请让我知道,这是一个有点大,张贴在这里。

+0

认识到你可能不会在应用程序域中与学生一起工作,并且每个人都会有一封外部电子邮件,因此上述内容可能会打折扣。道歉。 – 2014-04-14 15:00:47

+0

非应用程序域上可能有类似的东西吗? – Acornrevolution 2014-04-22 12:47:10

相关问题