IM-LogicDesignerのユーザ定義(JavaScript)を利用したBox連携

このCookbookでは、IM-LogicDesignerのユーザ定義(JavaScript)を使って業務でよく使われる基本的な操作を、ユースケースごとにサンプルコード付きで紹介します。
Box連携をJavaScriptで操作する流れは一見複雑そうに見えるかもしれませんが、実はとてもシンプルです。

1. 前提条件

2. 主に扱うAPI

3. ユースケース

今回は以下の12のユースケースを紹介します:

  1. フォルダの作成(createFolder、createFolderById)
  2. ファイルのアップロード(uploadFileById)
  3. フォルダ内のファイル一覧取得(listById)
  4. ファイルのダウンロード(downloadFileById)
  5. ファイルの削除(deleteFileById)
  6. 共有リンクの発行(createSharedLink)
  7. 共有リンクの削除(deleteSharedLink)
  8. ファイルのメタデータ作成(createMetadata)
  9. ファイルのメタデータ取得(getMetadata)
  10. ファイルのメタデータ削除(deleteMetadata)
  11. ファイルに対するアクセス権限の追加または更新(addOrUpdateCollaboration)
  12. ファイルに対するアクセス権限の削除(deleteCollaboration)

コラム①:BoxClientの利点と拡張性

BoxClientを使用することで「Box連携 IM-LogicDesignerタスク」では出来ないID操作が一部可能です。
Box連携 IM-LogicDesignerタスク」では難しいIDを介したファイルアクセスの方法、ファイル階層管理等の場合などにレスポンスを生かした柔軟な実装ができます。

BoxClientは、Box SDK for Java で提供されているすべてのID操作機能に対応しているわけではありません。基本的な操作を中心に実装されており、高度な機能や特殊なユースケースには対応していない場合があります。

BoxClientはソース公開されており、必要に応じてカスタマイズできます。未対応の機能が必要な場合は、ソースコードの拡張をご検討ください。

コラム②:管理効率と証跡の確保

実際の運用においては、アップロード後のフォルダIDやファイルIDなどの情報をテナントDBに保存しておくことを推奨します。

これにより、以下のような利点があります:

  • 後続のファイル操作が効率的になる
  • 作業履歴の証跡として活用できる
  • 監査対応やトラブルシューティングの効率性が向上する

4. サンプルコード

4-1. フォルダの作成(createFolder、createFolderById)

Box内に新しいフォルダを作成します。
プロジェクトや顧客ごとにフォルダを作成する場合に便利です。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  // ↓asUser() には「管理対象ユーザー」のIDを指定します。「サービスアカウント」のIDは指定できません。
  boxClient.asUser(input.box_user_id);

  // 「cookbook_sample」フォルダを作成、さらに「Fooプロジェクト用」フォルダを作成します。
  var rootFolderResult = boxClient.createFolder('cookbook_sample');
  var fooProjectFolderResult = boxClient.createFolder('cookbook_sample/Fooプロジェクト用');

  // 作成済みのフォルダIDを利用してフォルダを作成することも可能です。
  // 「cookbook_sample」のフォルダIDを使って、配下に「Barプロジェクト用」フォルダを作成します。
  var folderId = boxClient.getItemId('cookbook_sample').data;
  var barProjectFolderResult = boxClient.createFolderById(folderId, 'Barプロジェクト用');

  return {
    // フォルダIDを返却します。
    folder_id: folderId
  };
}

4-2. ファイルのアップロード(uploadFileById)

Boxに事前に作成しておいたフォルダにローカルファイルをアップロードします。
例えば、プロジェクトや顧客ごとに、日次レポートや帳票結果をアップロードする業務に使えます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-1で作成した「cookbook_sample/Fooプロジェクト用」フォルダに対して、フォルダIDを指定してファイルをアップロードします。
  // パスからフォルダIDを導出します。
  // 既にフォルダIDがわかっている、DBなどで管理している場合はパスからの導出は不要です。
  var folderId = boxClient.getItemId('cookbook_sample/Fooプロジェクト用').data;

  // PublicStorageにあるPDF「report.pdf」をBoxにアップロードします。
  var uploadFileName = 'report.pdf';
  var fileId = '';
  var publicStorage = new PublicStorage(uploadFileName);
  if (publicStorage.isFile()) {
    // ファイルを開きます。
    var fileReader = publicStorage.openAsBinary();
    try {
      // フォルダIDを指定してファイルをアップロードします。
      var result = boxClient.uploadFileById(folderId, uploadFileName, fileReader);
      // 正常にアップロードできたことを確認します。
      if (!result.error) {
        // ファイルIDを変数にセットします。
        fileId = result.data.id;
      }
    } finally {
      // ファイルを閉じます。
      fileReader.close();
    }
  } else {
    // PublicStorageにPDF「report.pdf」がありません。
    return;
  }

  return {
    // ファイルIDを返却します。
    file_id: fileId
  };
}

4-3. フォルダ内のファイル一覧取得(listById)

指定したフォルダ内に存在するファイルやサブフォルダの一覧を取得します。
フォルダの中身を確認したり、処理対象のファイルを動的に選ぶ際に便利です。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-1で作成した「cookbook_sample/Fooプロジェクト用」フォルダに対して、
  // フォルダ内のファイルまたはフォルダの情報一覧を取得します。
  //
  // パスからフォルダIDを導出します。
  // 既にフォルダIDがわかっている、DBなどで管理している場合はパスからの導出は不要です。
  var folderId = boxClient.getItemId('cookbook_sample/Fooプロジェクト用').data;
  var result = boxClient.listById(folderId, true);

  // idとnameのリストを作成
  var filesInfo = [];
  var data = result.data;

  for (var i = 0; i < data.length; i++) {
    var item = data[i];
    filesInfo.push({
      id: item.id,
      name: item.name
    });
  }

  return {
    // idとnameのリストを返却します。
    filesInfo: filesInfo
  };
}

4-4. ファイルのダウンロード(downloadFileById)

指定したファイルIDに対応するファイルをローカルにダウンロードします。
Box内に保存されたファイルを、自社システムやバッチ処理で利用する際に活用できます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルをダウンロードします。
  //
  // パスからファイルIDを導出します。
  // 既にファイルIDがわかっている、DBなどで管理している場合はパスからの導出は不要です。
  var fileId = boxClient.getItemId('cookbook_sample/Fooプロジェクト用/report.pdf').data;

  // パブリックストレージにダウンロードします。
  var publicStorage = new PublicStorage('download_report.pdf').createAsBinary();
  var result = boxClient.downloadFileById(fileId, publicStorage);
  publicStorage.close();

  return;
}

4-5. ファイルの削除(deleteFileById)

指定したファイルIDのファイルをBoxから削除します。
不要になったファイルを定期的にクリーンアップする処理に利用できます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルを削除します。
  //
  // パスからファイルIDを導出します。
  // 既にファイルIDがわかっている、DBなどで管理している場合はパスからの導出は不要です。
  var fileId = boxClient.getItemId('cookbook_sample/Fooプロジェクト用/report.pdf').data;

  // ファイルを削除します。
  var result = boxClient.deleteFileById(fileId);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

4-6. 共有リンクの発行(createSharedLink)

指定したファイルに対して共有リンクを発行し、URLを取得します。
外部の関係者とファイルを一時的に共有したい場合に便利です。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルに共有リンクを発行します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // 共有リンクを発行します。
  var sharedLink = boxClient.createSharedLink(path, '2025-12-31T12:34:56Z', 'OPEN', true, false).data;

  return {
    // 共有リンクを返却します。
    shared_link: sharedLink
  };
}

4-7. 共有リンクの削除(deleteSharedLink)

発行済みの共有リンクを無効化します。
一時的な共有が不要になったタイミングでリンクを削除することで、セキュリティを保てます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-6で発行した共有リンクを削除します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // 共有リンクを削除します。
  var result = boxClient.deleteSharedLink(path);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

4-8. ファイルのメタデータ作成(createMetadata)

指定したファイルに対して、カスタムメタデータを追加します。
ファイルに対して属性を付与することで、検索性や分類性を高めます。

Boxのメタデータには、テンプレートを利用する方法と、テンプレートを利用しないカスタムメタデータを追加する方法の2種類があります。
本記事のコードでは、実装をシンプルにするためカスタムメタデータを追加するケースを紹介します。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルにカスタムメタデータを追加します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // カスタムメタデータ
  var metadata = {
    title: '月報資料',
    tag: '重要',
    author: '山田太郎',
    department: '営業部',
    reportDate: '2025-06-19',
    status: '提出済み',
    projectCode: 'PRJ-202506'
  };

  // カスタムメタデータを追加します。
  var result = boxClient.createMetadata(path, metadata);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

4-9. ファイルのメタデータ取得(getMetadata)

指定したファイルに付与されたメタデータを取得します。
ファイルの属性をもとに処理を分岐させたり、表示内容を変える際に活用できます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-8で追加したカスタムメタデータを取得します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // メタデータを取得します。
  var result = boxClient.getMetadata(path);
  var jsonString = JSON.stringify(result.data);

  return {
    // メタデータを返却します。
    metadata: jsonString
  };
}

4-10. ファイルのメタデータ削除(deleteMetadata)

指定したファイルに付与されたメタデータを削除します。
不要になった属性を整理する際に利用できます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-8で追加したカスタムメタデータを削除します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // メタデータを取得します。
  var result = boxClient.deleteMetadata(path);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

4-11. ファイルに対するアクセス権限の追加または更新(addOrUpdateCollaboration)

指定したファイルに対して、他ユーザーのアクセス権限(閲覧・編集など)を追加または更新します。
チームメンバーや外部パートナーとの共同作業時に便利です。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルにアクセス権限を追加します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // アクセスの権限レベルを指定します:
  // CO_OWNER/EDITOR/VIEWER_UPLOADER/PREVIEWER_UPLOADER/VIEWER/PREVIEWER/UPLOADER
  var accessLevel = 'EDITOR';

  // 権限追加・更新対象のユーザID
  var boxUserId = 'ユーザIDを指定してください';

  // メタデータを取得します。
  var result = boxClient.addOrUpdateCollaboration(path, boxUserId, accessLevel);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

4-12. ファイルに対するアクセス権限の削除(deleteCollaboration)

指定したファイルに対するユーザーのアクセス権限を削除します。
プロジェクト終了や担当者変更時に、不要なアクセスを制限できます。

function run(input) {

  // BoxClientを使用します。
  var boxClient = new BoxClient();

  // ユーザIDを指定します。
  boxClient.asUser(input.box_user_id);

  // 4-2でアップロードした「cookbook_sample/Fooプロジェクト用/report.pdf」ファイルのアクセス権限を削除します。
  //
  // パスはテナントDBテーブルなどで管理しているとスムーズにアクセスできます。
  var path = 'cookbook_sample/Fooプロジェクト用/report.pdf';

  // 権限削除対象のユーザID
  var boxUserId = 'ユーザIDを指定してください';

  // メタデータを取得します。
  var result = boxClient.deleteCollaboration(path, boxUserId);

  return {
    // エラーフラグを返却します。
    error: result.error
  };
}

5. まとめ

ユーザ定義(JavaScript)を使えば、ファイルのアップロードや共有、フォルダ管理など、実業務でよく使う操作を簡単に実装できます。
今回紹介したユースケースは、どれも組み合わせやすく、実際の業務にそのまま応用できます。