[GAS][Sites]編集はさせないで、ファイルアップロードのみ許可するには(2): 逆引きGoogle Apps Script

2015 年 9 月 26 日 土曜日

【Googleサイト】編集はさせないで、ファイルアップロードのみ許可する(1)の続き。Google Apps Scriptによる解決方法をソースコード付きでご紹介。

おさらい

前回のおさらい。

Google Sitesでは、ページにファイルを添付することができるが、ファイルを添付することができるのは、そのページの編集権限を持ったユーザーだけだ。

閲覧権限だけをもつユーザーに、ファイルのアップロードのみ許可することは、果たして可能なのだろうか。

ファイルキャビネットでファイルをアップロードできるということは、ページを編集できるということ。ページを編集できるということは、ページを削除することだってできるし、ページのURLを変えることだってできるということだ。

何が問題かというと、権限が強すぎるということなのだ。

ソースコード

前回の投稿で触れていた、Google Apps Scriptによる解決方法が検証できたのでソースコードを掲載する。

function doGet(e){
  var app = UiApp.createApplication();
  var form = app.createFormPanel().setTitle('viwer upload sample').setEncoding('multipart/form-data')
      .add(app.createVerticalPanel()
           .add(app.createLabel('File:'))
           .add(app.createFileUpload().setName('fileName').setId('fileName'))
           .add(app.createLabel('Description:'))
           .add(app.createTextBox().setName('description').setId('description'))
           .add(app.createSubmitButton('Upload'))
          );      
  app.add(form);
  return app;  
}

function doPost(e){  
  var app = UiApp.getActiveApplication(); 
  var filePage = SitesApp.getActivePage();  
  if (e.parameter.fileName.length > 0){
    filePage.addHostedAttachment(e.parameter.fileName, 
                                 e.parameter.description);
  }      
  app.add(app.createLabel("Upload completed. Please reload page."));
  return app;
}

Google Sitesに設置する手順

(1) Google sitesで新しいスクリプトを追加(サイト管理 > Appsスクリプト > 新しいスクリプト)をクリックし、表示されるエディタに上記のコードをすべて貼り付ける。初期画面にある

function myFunction() {
  
}

は削除して頂いて構わない。

(2) 適当な名前をつけてプロジェクトを保存し、一旦エディタを閉じる。

(3) ファイルキャビネットページを開く。

(4) ページを編集 > 挿入 > Appsスクリプトガジェットをクリック。

(5) 作成したスクリプトを選択。

(6) 挿入オプションで、「全員にこのサービスの実行を許可する」にチェックを入れて保存する。

ファイルキャビネットページをリロードすると、ファイルアップロードフォームが表示されるはずだ。これで、閲覧権限しか持たないユーザーでも、ファイルをアップロードすることができる。

なぜ、閲覧者でもアップロードできるのか?

Google Sitesに貼りつけたAppsスクリプトは、そのスクリプトを貼りつけたユーザーの権限で実行されるようだ。そのため、閲覧権限しか持たないユーザーでも、Appsスクリプト実行権限を持つユーザーとして、ファイルをアップロードできるということだ。

注意点

上記のソースコードはあくまでアップロードができるかどうか検証するために作ったものなので、入力チェックは無いし、装飾も施していない。実際に利用される際は、少し手を加える必要がある。

また、スクリプトを貼りつけたユーザーの権限で実行されるという特性上、アップロードしたファイルの投稿者は、すべてあなたの名前になっているはずだ。

以上の点に注意して頂きたい。

関連記事

コメント / トラックバック 5 件

  • […] Apps Scriptで実現できるのではないだろうか。(2012/2/29追記:実現できました)記憶によると、サイトに埋め込ませたApps […]

  • コンノ より:

    はじめまして。google site を最近触り始めたばかりの者です。
    こちらの記事を参考に試行錯誤してみたのですが
    どうにも上手くいかず、コメントさせていただきました。

    > Google Sitesに設置する手順
    に則って、ソースコードをコピペしたAppsスクリプトをキャビネットページに挿入。
    作成されたフォームで実際にアップロードしようとすると、
    なぜか0バイトの userAppPost なるファイルがダウンロードされます。
    ・ファイルキャビネット自体は正常に動作しています
    ・ログイン状態、ログアウト状態、両方で試しましたがどちらもダメでした
    ・ファイルを何も選択していない状態で「Upload」を押しても同様の症状でした
    特別何か手を加えたりはしていないはずなので
    逆に何か設定が足りないのでしょうか?

    間抜けな質問で申し訳ありません。お暇なときにでもご教示くだされば幸いです。
    よろしくお願いします。

  • bonk より:

    コンノさん、コメントありがとうございます。
    ひょっとすると、記事のソースコードに誤りがあるのかもしれません。
    今はちょっと検証できませんので、申し訳ありませんが、少しお時間を下さい。
    検証できましたら、またこちらのコメント欄で回答します。

  • bonk より:

    コンノさん
    返信が遅くなりまして大変申し訳ありません。

    こちらで検証してみましたが、正常に動作しているようです…。
    userAppPostがダウンロードされる、というのは、実行時例外が発生した場合に起こる現象ですので、今回のケースでいうと、doPostメソッドで何らかのエラーが発生しているのだと思われます。

    doPostを以下のように変更して頂き、どのようなログが出力されているか教えて頂けますでしょうか?

    function doPost(e){  
      try{
        var app = UiApp.getActiveApplication(); 
        var filePage = SitesApp.getActivePage();  
        if (e.parameter.fileName.length > 0){
          filePage.addHostedAttachment(e.parameter.fileName, 
                                       e.parameter.description);
        }       
        app.add(app.createLabel("Upload completed. Please reload page."));
      } catch (e) {
        Logger.log(e);
      }
      return app;
    }
  • […] (GoogleDriveへのファイルアップ)http://www.bmoo.net/archives/2012/02/312930.html […]

コメントをどうぞ

トラックバック

このエントリーのトラックバックURL:

http://www.bmoo.net/archives/2012/02/312930.html/trackback