Google Driveの場合は、Google Apps ScriptもしくはDrive APIが充実しているため、割と簡単に権限変更が可能です。しかし、Enterpriseで採用されてるBoxとなると、Box APIやNode.js用のライブラリなどが用意されているのですが、リファレンス資料が充実していない為、結構厄介です。

今回、Google Apps ScriptでBox Content Pickerを使ってフォルダを選択、そのフォルダ内のコラボレータ(権限保有者)の一覧を取得、コラボレータの権限を変更を実践してみたいと思います。当然、Node.js用ライブラリなどは使えないのと、Node.jsであってもrequestモジュールのように手動でBox APIを叩けるようにしておくのは重要なので、その辺りを取り組んでみます。

難易度:

今回使用するファイル等

サンプル使用時は、Client IDとClient Secretの2つの書き換えを忘れずに。

事前準備

リダイレクトURL

リダイレクトURLとは、認証を完了しAccess Tokenを取得したら戻るべきURLを指定するものです。これは、スクリプトIDをもとに作られているので、スクリプトIDを取得して組み立てます。

  1. スクリプトエディタのサイドバーより、プロジェクトの設定を開く
  2. 情報の中にある「スクリプトID」を控えておく。
  3. https://script.google.com/macros/d/スクリプトID/usercallback として組み立てる。これがリダイレクトURLとなる。

図:スクリプトIDを取得してURLを組み立てておく

Box APIの準備

Box APIを使うために必要なクライアントIDとシークレットを生成します。以下の手順で作成します。

  1. Box Developer Consoleにて新規アプリをカスタムアプリで作る。ユーザ認証はOAuth2.0を選び、名前をつけて、アプリの作成をクリック
  2. すでにクライアントIDとシークレットが生成されてるので、コピーする
  3. リダイレクトURLに前項で作ったURLを入力
  4. スコープでは読み書きと、ユーザ・グループの管理にチェックを入れる
  5. CORSドメイン設定をしないと呼び出せないので、入力欄に「https://*.googleusercontent.com」を入力する
  6. 最後に変更を保存をクリック

図:クライアント情報とリダイレクトURL

図:スコープを設定

OAuth2.0認証

取得したクライアントID、シークレットを元にGoogle Apps Scriptにこれらを記述する。これで認証の準備が完了したので、

  1. スプレッドシートメニューの「OAuth認証」→「認証の実行」をクリック。
  2. ダイアログの下部にある「アクセス承認」をクリック
  3. Boxログイン画面が出るので、ログインし、Boxへのアクセス許可をクリック
  4. これで、アクセストークンが取得出来ました。
  5. スプレッドシートメニューの「OAuth認証」→「プロパティ」から格納情報を確認出来ます。oauth2.boxに一連の情報がJSON形式で格納されています。
  6. これで、コードからBox APIを叩く事ができるようになります。

図:コードに情報を追記する

図:認証画面

ソースコード

今回は権限変更を実装していますが、共有期限変更なども可能です。しかし、共有期限の変更は無料アカウントでは出来ないので、403エラーとなります。以下主要な部分のソースコードを記載します。

GAS側コード

  • getAccessTokenは、HTML側のBox Content Pickerで表示する際のアクセストークンとして必要なコードを返す為の関数です。
  • getBoxMemberは、指定したフォルダのコラボレーターのリストを取得して返します。
  • このとき、コラボレータのメンバーの詳細な情報が返ってきますが、重要なのはroleとcolabid。roleは権限です。
  • 問題はcolabidですが、Boxのリファレンスにはcollaboration_idとして記載があるものの、何がそれに該当するのか一切記載がありません。これは、メンバー固有のIDでもフォルダのIDでもなく、コラボレータとして追加された時に付与されるIDで、rec.idにあるように、返り値のすぐ最初にあるid値がそれに該当します。
  • また、フォルダにもcollaboration_idに該当するものが存在し、これをもってして、ユーザやフォルダの権限変更や共有期限の変更を行います。Boxのリファレンス資料は実に不親切。
  • changeLimitでは、前述のcollaboration_idに該当するcolabidの値をもって、roleを変更します。
  • 変更時のメソッドはPUTにてUrlfetchAppでリクエストを行います。
  • HTTPステータスコードはresponse.getResponseCodeで取得可能
  • 今回とくに、返り値自体は不要なので、そのままHTML側で完了の処理に移ります。

HTML側コード

今回はインターフェースはVue + Vuetifyで構築しています。全体のコードはサンプルをご覧ください。ここでは、Box Content Pickerの表示部分だけを表示しています。

  • HTML側の多くのコードはVuetifyのインターフェース操作用コマンドとHTMLが殆どです。
  • HTML表示時の初期化で、上記のコードを実行し、Box Content Pickerの初期化を行っています。
  • フォルダを指定をクリックすると、GAS側からAccess Tokenを取得
  • 取得後に、onSuccessのコードが実行されて、Pickerが表示されます。
  • 今回はフォルダピッカーとして作りましたが、ファイルピッカーとしても使えます。

フォルダの共有期限変更

今回は行いませんでしたが、expires_atにてユーザの共有期限変更が、roleの変更時に行えます(というよりも、expires_atのみではエラーになるので、roleの指定は必ず必要です)。

フォルダ自体の共有期限もユーザ同様にcollaboration_idとなるid値が割り振られているので、それをもってして共有期限変更もできるのですが、フォルダの場合には、これとは別に違うエンドポイントとunshare_atを変更することでも、共有期限の変更が可能です。こちらはcollaboration_idではなくfolderidを使うので、難しいことはありません。

エンドポイントとリクエストボディの値を上記に置き換え、適切なexpiredateの形式を指定すればフォルダは共有期限変更が可能です。ユーザだけが、オカシナスタイルになっています(普通にフォルダのIDとユーザのIDの2つをパラメータとして指定するようなAPIにすれば良いにも関わらず、説明のないcollaboration_idという何者なのかがわからないものを利用してるのはいかがなものか)。

実行結果

Box Content Pickerの画面

スプレッドシートメニューのOAuth認証→「Box管理」を開くと、ダイアログが開かれます。フォルダの指定ボタンをクリックすると、Box Content Pickerが起動し、初期化時のfolderIdの値(ルート直下は0)に基づいて開かれます。フォルダを選択肢、右下の選択ボタンをクリックすると、そのフォルダに対するコラボレータの一覧が取得し、表示される仕組みになっています。

※設定を変更すれば、フォルダではなくファイルピッカーにもなります。

図:Pickerでフォルダを選択できる

図:コラボレータ一覧取得後

コラボレータの共有期限変更

コラボレータ一覧の各レコードのアクションにあるアイコンをクリックするとダイアログが表示され、権限を変更し「変更」をクリックすると、Box APIが叩かれて、権限が変更されます。この権限変更メソッドは同時にexpires_atに値を指定することで、共有期限の変更も可能です(有償アカウントのみ)。

図:共有期限変更ダイアログ

関連リンク

共有してみる: