0

ログインしている学生のメールアドレスを見て、成績表でメールを見つけ、メールが入っている列に基づいて学生の成績を表示する成績表 Web アプリスクリプトがあります。唯一の問題は、スプレッドシートが公開しました。スプレッドシートをプライベートに保ちながら、このスクリプトを機能させるにはどうすればよいですか? 「リンクを知っている人なら誰でも」を選択した場合、誰かがスプレッドシートを見つける可能性は低いと思いますが、非公開のままにしたいと思います。また、「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

私は、Google Apps for Education スイートを実行しているドメイン管理者であり、多くの同様のアプリケーションが配置されています。ドメインの管理者権限を持っているかどうかについては言及していませんが、持っていると思いますか?

私はすべてのスプレッドシートをプライベートに保ち、Web アプリを自分自身として実行します (スクリプトに必要なアクセスを許可します)。

あなたの主な問題は、.getEffectiveUser()必要なものを提供していない使用に起因すると思います。Session.getActiveUser.getEmail()学生オブジェクト (これは基本的に、標準の getRowsData 関数を使用してオブジェクトとして返される学生の詳細のシートです) を使用して繰り返し、電子メールの値 (見つからない場合はユーザー = 不明) を照合します。

これは、2000 人を超える学生ベースの私にとって完璧に機能します。すべてのデータは非公開であり、アプリは迅速に応答してパーソナライズされた情報を提供します。

サンプルアプリをご覧になりたい場合はお知らせください。ここに投稿するには少し大きいです。

于 2014-04-14T02:05:09.470 に答える
0

クラスごとに Google グループを設定してみませんか? 次に、適切なスプレッドシートの SHARE 権限に google グループを追加します。これには、適切な Google グループを介してさまざまなクラスに簡単にメールを送信できるという追加の利点があります。このシナリオでは、成績スプレッドシートは非公開のままで、あなたとあなたの Google グループにリストされているメール アドレスだけがアクセスできます。

于 2013-05-10T11:41:57.527 に答える
0

ユーザーとしてアクセスしたそのサービスから、urlget を介して、自分として公開された別のアプリ スクリプト サービスを呼び出します。それはss関連の仕事をします。ただし、サービス呼び出しでタイムアウトが発生する場合があります。

于 2013-04-21T14:27:18.823 に答える