Pythonを使用したBoxのフォルダツリーの再構築

Yuko Taniguchi
Box Developer Japan Blog
12 min readNov 22, 2023

Boxを初めて使用する場合でも、長い間使用している場合でも、フォルダツリーの構造は理解しておくべき重要な概念です。最近、Boxの新しいコミュニティフォーラム (アカウントをお持ちでない場合は作成してください) に、Boxによく寄せられる質問である、ウォーターフォール権限の要件を回避する方法について開発者の投稿がありました。単刀直入に言うと、そんなことはできませんが、似たようなことをしなければならない場合もあります。もう少し詳しく見てみましょう。

最初に — ウォーターフォールとは 何か?

この質問がある場合は、Boxにおける権限の仕組みに関するサポート記事をご覧ください。基本的に、ウォーターフォール権限とは、コラボレーションが最下位の項目まで継承されることを意味します。

フォルダツリーの説明

図の右側に示すように、人事部の権限は、フォルダツリー全体 (各フォルダ内のファイルを含む) で滝のように上から下に継承されます。

簡単そうに聞こえますよね。では、なぜ別の権限モデルに従いたいのでしょうか。

たとえば、会社の全従業員に関連した特定のコンテンツを確認する必要があるグループが2つあるとします。各従業員には、Personnel (人事) とConfidential (機密) という2つのフォルダがあります。人事部はツリー全体のすべてのフォルダを参照する必要がありますが、経理部は個々のPersonnelフォルダへのアクセス権限のみが必要です。上のスクリーンショットに示されているように、この場合は経理部をそれぞれのPersonnelフォルダにコラボレータとして追加すればよいだけのように思われますが、それでは人事部のユーザーにはわからない大きな問題を引き起こします。

正しくない状態

上の図では、現在の状態のほか、考えられる2つの解決策が示されていますが、最善の選択肢はさらに下に示すオプション3です。その理由を詳しく見てみましょう。

現在の状態では、それぞれ「Personnel」という名前のフォルダのリストだけが経理部に表示されます。フォルダの名前からはわからないため、経理部のユーザーは各フォルダを調べて、どの従業員と一致するかを示すデータを探さなければなりません。これは明らかに効率的ではありません。また、[すべてのファイル] ページは、漠然としたフォルダで埋め尽くされます。

オプション1では、PersonnelフォルダとConfidentialフォルダの名前が従業員の名前を含むよう変更されています。これは素晴らしい考えのようですが、実際には、現在の状態に関する大きな問題の1つは解決されていません。つまり、メインのフォルダツリーには非常に多くのフォルダが散乱したままです。従業員数が100人を超える大企業で働いている場合、[すべてのファイル] ページには100を超えるフォルダが表示されます。それは最適なエクスペリエンスではありません。また、従業員名が複数の場所に複製されます。

オプション2では、人事部と同様に、経理部がより上位レベルのコラボレータとして追加されています。Confidentialフォルダは機密であり、ほとんどの場合、人事部以外には表示されるべきではないため、このオプションもおそらく適していません。

では、より適切なオプションは何でしょうか。

オプション3

オプション3では、EmployeesフォルダレベルとPersonnel/Confidentialフォルダレベルを入れ替えます。たとえば、経理部がBob SmithのPersonnelフォルダのファイルにアクセスするには、[Human Resources] > [Employees] > [Personnel] > [Bob Smith] の順に移動し、人事部がBob SmithのConfidentialフォルダのファイルにアクセスするには、[Human Resources] > [Employees] > [Confidential] > [Bob Smith] の順に移動します。

さて、あなたはおそらくこのように考えるでしょう。オプション1は、従業員の名前が複数の場所にできてしまうため、よくないアイデアなのではなかったか。そのとおりです。しかし、オプション1では、経理部の [すべてのファイル] ページに非常に多くのフォルダが存在していました。オプション3では、それらすべてがメインとなる1つのPersonnelフォルダに統合されます。

人事部は、両方の場所でファイルを確認する必要がある場合、Bob Smithを2回探さなければなりませんが、機密ファイルを保護し、フォルダツリーを整理しておくためには必要な負担です。

今回のデモでは説明しませんが、上記の解決策の1つとして、Personnelフォルダ内のConfidentialフォルダへの共有リンクをブックマークとして追加できます。共有リンクはアクセス権限に紐付けることができるため、経理部の任意のユーザーがConfidentialフォルダの共有リンクをクリックした場合でも、コンテンツは表示されません。

それでは、BoxのフォルダAPIPythonを使用して、ツリーの表示をオプション3のようにする方法を見てみましょう。

デモ

開始する前に、以下の注意事項をお読みください。

テストと開発はサンドボックス環境、つまり実稼働以外の環境で行うことを強くお勧めします。詳細な計画やテストを行わずに、実稼働環境のフォルダツリーを変更しないでください。弊社による支援をご希望の場合、Box Consultingのご利用をご検討ください。

このデモは、不可能なことは追い求めずに実現できることを実行する技術を示すもので、作業を開始する際に役立ちます。このスクリプトについて、大きなフォルダツリーと大量のコンテンツを使用した大規模なテストは行っていません。大量のコンテンツを移動すると、大規模ファイル操作 (LFO) が発生し、スクリプトがエラーになる場合があります。これを大規模に実行するには、さらにロジックとエラー処理が必要になる可能性があります。

このスクリプトでは、コラボレーションの追加や変更を行っていません。純粋にコンテンツを再編成する方法を示しています。再構築するコンテンツの所有者としてスクリプトを実行することをお勧めします。そうしないと、結果が変わる場合があります。

Boxカスタムアプリの作成

ゼロから始める場合は、すべての手順に従ってください。サンドボックスなど、現在存在するBoxインスタンスを使用する場合は、箇条書きの3つ目に進んでください。

  • Boxの無料アカウントを作成します。
  • メールを確認して登録プロセスを完了し、Boxにログインします。
  • Box開発者コンソールに移動します。これにより、Developerアカウントが有効になります。注 — 無料アカウントを使用している場合、作成できるのはOAuth 2.0アプリケーションのみです。管理コンソールにもアクセスできません。このデモでは必要ありませんが、実際の環境では、Boxの管理者が使用できる機能へのアクセス権限が必要になります。たとえば、グループやユーザーを作成したり、別のユーザーとしてログインしたりする場合です。
  • 新しいBoxアプリケーションを作成します。[カスタムアプリ] を選択し、フォームに入力して、[次へ] をクリックします。
  • [ユーザー認証 (OAuth 2.0)] を選択し、[アプリの作成] をクリックします。
  • [リダイレクトURI] まで下にスクロールし、リダイレクトURI http://127.0.0.1:5000/callbackを追加します。必要に応じて別のURIを使用できますが、後で.envファイルでその値を変更する必要があります。
  • [アプリケーションスコープ] のすべてのチェックボックスをオンにします。
  • [変更を保存] をクリックします。
  • クライアントIDとクライアントシークレットをメモします。これらは後で必要になります。

コードのダウンロード

マシンにPythonをインストールしておく必要があります。ここではVisual Studio Codeを使用して説明しますが、好きなコードエディタを使用できます。

gitを使用してリポジトリを複製します。gitがない場合は、zipをダウンロードすることもできます。

git clone git@github.com:box-community/box-python-restructure.git
cd box-python-restructure

仮想環境を設定します。

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

ローカルアプリケーションのenvファイルを作成します。

cp .env.sample .env

任意のコードエディタでコードを開きます。Visual Studio Codeを使用する場合は、次のショートカットを使用できます。

code .

.envファイルを開き、前にメモしたクライアントIDとクライアントシークレットをコピーして貼り付けます。

最初の実行

スクリプトのいずれかを初めて実行すると、ウェブブラウザのウィンドウが開き、Boxにログインするよう求められます。ログインすると、アプリケーションを承認するように求められます。このプロセスが完了したら、ブラウザウィンドウを閉じてもかまいません。

[Boxへのアクセスの許可]
ブラウザのポップアップ

承認トークンの有効期間は60分で、更新トークンの有効期間は60日です。何もできなくなった場合は、.outh.jsonファイルを削除して、アプリケーションを再承認できます。アプリケーションを60日以上使用しない場合は、アプリケーションの再承認が必要になります。

デモ用フォルダツリーの作成

デモのコードを実行するために、再編成できるフォルダツリーを設定する必要があります。デモ用ツリーの設定に使用できる、デモの.pdfファイルとdemo.pyファイルがありますので、そのままお使いいただけます。注 — コラボレーションは設定されません。

デモを実行するには、以下のコマンドを使用します。

Human Resourcesフォルダがすでに存在する場合は、自動的に削除されます。さらに、次の手順で使用するために、.envファイルのHuman Resources親フォルダIDが自動的に置き換えられます。これにより、複数回テストできます。

デフォルトでは、10人の従業員が作成され、それぞれのサブフォルダに5つのファイルが含まれます。これらの数は、コード内で変更できます。

python3 demo.py
HRフォルダのデモデータ
従業員のデモデータ

スクリプトの実行

デフォルトでは、含まれているmain.pyファイルにより、デモデータに基づいてコンテンツが再構築されます。スクリプト内のロジックや変数は自由に変更できます。スクリプトを実行するには、以下のコマンドを使用します。

python3 main.py

別のフォルダ命名規則を使用する場合は、main.pyファイルの下部にある変数を変更できます。demo.pyファイルを使用して構造を作成する場合は、そのファイルも変更する必要があります。

parent_folder_id = os.getenv("PARENT_FOLDER_ID")
folder_name = 'Employees'
subfolder_names = ['Personnel', 'Confidential']
再構築後のEmployeesフォルダ
再構築後のConfidentialフォルダ

GitHubリポジトリへのリンクはこちらです。

関連リソース

RuiのPythonワークショップ

フォルダAPIの仕様

アイデア、コメント、フィードバックがある場合は、コミュニティフォーラム (英語のみ) にコメントをお送りください。

--

--