見出し画像

[Box CLI×PowerShell ]大量フォルダ作成+ファイル名照合+一括共有を実現する

こんにちはGO株式会社 IT戦略部の白井です。
最近はPowerShellをChatGPTさんに書いてもらってます。まだまだ一回では無理ですが、あーこういう方針で書いていけばいいんだなぁができて便利ですね!

今回は、
「Boxに100個会社名でフォルダ作って、それぞれ正しい会社名が含まれたファイルになっていることを確認した上で、一気に外部共有したいんだけど」に答えていきます!!

最終的にできること

  • CSVのリストから、大量のフォルダを一気に作成 ←Box CLI!

  • フォルダ名がファイル名に含まれていることを一気に確認できる ←PowerShell & Box CLI!

  • 各フォルダに対して、CSVのリストから一気に共有ができる ←Box CLI!

という感じなので、一気に作成と一気に共有はBox CLIですぐにできてしまいます!真ん中はお好みでご利用ください。(そんなに使うタイミングない気がする)

実行環境

Windowsでも、Macでも可です!
ここではMacで対応しています。
実はMacでもPowerShellが使えます!(以前に社名変更のブログでもMacでPowerShellを使って大量のアカウント変更に対応しました!)

読んで欲しい人

CLIなんてこわい!無理!な人

おおまかな流れ

  • Box CLIを使えるようにする(Boxの公式ドキュメントに従って楽々設定)

  • PowerShellを使えるようにする(Windowsならすぐ使える、Macならインストールしてください。)

  • 大量のフォルダを作成するための、大元のフォルダを作成する

  • 作りたいフォルダのリストから、一気に作成する

  • それぞれのフォルダにファイルを入れる

  • ファイル名にフォルダ名が含まれるか確認する

  • 各フォルダに対して、一気に共有する


Box CLIを使えるようにする

Boxの公式ドキュメントがものすごく丁寧なので、こちらに従って設定していきます。管理者権限を持っていれば設定可能です。

こちらに従って進めていくと、Box CLIのアプリが環境の中に作成されます。

Box CLIが開発者コンソールに爆誕


OAuth Client IDとOAuth Client Secretをパスワードマネージャーにしまっておきましょう。

ではログインしてみましょう!お手元のターミナルで

box login

すると、以下のように表示されるはずです。先ほどメモったOAuth Client IDを入力しましょう。

If you are not using the quickstart guide to set up (https://developer.box.com/guides/tooling/cli/quick-start/) then go to the Box Developer console (https://cloud.app.box.com/developers/console) and:
1. Select an application with OAuth user authentication method. Create a new Custom App if needed.
2. Click on the Configuration tab and set the Redirect URI to: http://localhost:3000/callback. Click outside the input field.
3. Click on Save Changes.
? What is the OAuth Client ID of your application?

次にシークレットを質問されます。OAuth Client Secretを入力しましょう。

? What is the OAuth Client Secret of your application?

すると、ブラウザーで認証を求められますので、ログインしてターミナルにもどりましょう!

PowerShellを使えるようにする

こちらもMicrosoftの公式ドキュメントが親切なので、こちらを確認しながらインストールしてください。

最新をインストールすればよし!

大量のフォルダを一気に作成する

実はこれも先ほどご案内した公式ドキュメントに詳しく書いてあります。
魔法の言葉だbulk

box folders:create --bulk-file-path=<PATH_TO_CSV> 

CSVのテンプレはこちらから。ダウンロードしたCSVを編集して、パスを上記のコマンドで指定してあげれば一気にフォルダが作成されます。あら便利!公式神!

CSVの項目
Name:フォルダ名
Description:説明
ParentId:大量のフォルダを作成する場所のフォルダのID

ParentIdは0だと、ユーザーのroot直下に大量のフォルダが作成されます。なんかちょっと邪魔ですよね…。特定の場所に作りたい場合は、先にフォルダを作成してあげて、IDを確認します。
作ったフォルダのIDの確認は、rootでgetしたらたどっていけばOK!
お目当てのフォルダ名の上にあるIDがそのフォルダのIDです。

#0で一番上に置いてあるフォルダのIDを確認できる
>box folders:get 0   
・
・
・
Type: folder
ID : 'xxxxx'
Sequence ID: '0'
ETag: '0'
Name: ほげほげ
・
・
#ほげほげのさらに下にお目当てのフォルダがあるなら、ほげほげのIDから確認したいフォルダのIDを確認する
>box folders:get xxxxx 
・
・
・
Type: folder
ID : 'xxxxx2'
Sequence ID: '0'
ETag: '0'
Name: ほげほげ2

Githubにたくさんbulkできるものが載ってます。
https://github.com/box/boxcli/tree/main/docs/Bulk%20actions

それぞれのフォルダにファイルを入れる

こちらは手作業で入れてってください。

ファイル名にフォルダ名が含まれるか確認する

ここでついに準備したPowerShellちゃんが登場です。だだん。
(ほぼChat GPTに書いてもらったやつ)

# "root"フォルダのID  さっき確認したよね
$rootFolderId = "XXXXXX"  
  
# "root"フォルダ内のすべてのサブフォルダのIDを取得  
$subFoldersJson = box folders:items $rootFolderId --json --sort=id --fields=id,name,type  
  
# 出力を表示(デバッグ用)  
#Write-Output $subFoldersJson   
  
# JSON文字列をPowerShellオブジェクトに変換  
$subFolders = $subFoldersJson | ConvertFrom-Json  
  
# 結果を格納する配列を初期化  
$results = @()  
  
# サブフォルダのIDを表示する  
foreach ($folder in $subFolders) {  
    if ($folder.type -eq "folder") {  
        # サブフォルダ内のファイル名を取得  
        $subFolderFilesJson = box folders:items $folder.id --json --sort=id --fields=id,name,type  
  
        # 出力を表示(デバッグ用)  
        Write-Output $subFolderFilesJson   
  
        # JSON文字列をPowerShellオブジェクトに変換  
        $subFiles = $subFolderFilesJson | ConvertFrom-Json  
  
        # 各ファイルについて処理を行う  
        foreach ($file in $subFiles) {  
            # ファイル名とフォルダ名が一致するか確認
            $folderName =  $folder.name
            $isMatch = $file.name -like "*$($folderName)*"   
  
            # 結果オブジェクトを作成  
            $result = [PSCustomObject]@{  
                'FolderID'   = $folder.id  
                'FolderName' = $folder.name  
                'FileID'     = $file.id  
                'FileName'   = $file.name  
                'IsMatch'    = $isMatch  
            }  
  
            # 結果を配列に追加  
            $results += $result  
        }  
    }  
}  
  
# 結果をCSVファイルにエクスポート  
$results | Export-Csv -Path '/Users/hogehoge/Downloads/results.csv' -NoTypeInformation  

これを走らせるとこんな感じの結果が返ってきます

"FolderID","FolderName","FileID","FileName","IsMatch"
"123456739052","双葉商事","1234567118946","双葉_テスト.docx","False"
"123456739052","双葉商事","1234567858355","双葉商事_てすと.docx","True"
"123456739052","双葉商事","1234567014024","双葉商事株式会社.docx","True"
"123456714098","京都コーヒー","123456728789","東京コーヒー_動画.gslides","False"
"123456714098","京都コーヒー","123456754597","京都コーヒー_動画.docx","True"

各フォルダに対して、一気に共有する

またまたBox CLIをつかって魔法の言葉bulkを唱えていきます。

box collaborations:create --bulk-file-path /Users/hogehoge/Downloads/collaborations-add.csv

CSVのテンプレはこちらから

CSVの項目
ITEMID:さっき取得したFolderID
ITEMTYPE:folder
role :いっぱいあるので選ぶ
editor|viewer|previewer|uploader|previewer_uploader|viewer_uploader|co-owner→詳しくはこちらを参照
login:招待する人のメールアドレス
user-id:今回は使いません
group-id:今回は使いません

CSVはこんな感じ

ITEMID,ITEMTYPE,role,login,user-id,group-id
123456714098,folder,editor,hogehoge@hoge.tokyo,,
123456714098,folder,viewer,gehogeho@hoge.tokyo,,

えいや!
って感じに招待が完了します。

ばっちり招待できた!

まとめ

  • Box CLIはめちゃ便利

  • bulkは魔法の言葉

  • Box CLI+PowerShellで何でもできる

ということで、初めてのBox CLIでした!PowerShellは日の目を見る日が来るのだろうか・・・(作っただけ疑惑w)

今回参考にさせていただいたブログはこちらです。
ありがとうございました。
https://note.com/0375/n/n53138956e601

※掲載内容は2024年5月1日現在の内容です。