Box CLI 使ってみた

# Box CLI 使ってみた

弊社の定型作業をBoxCLIを使用し、スクリプト化したので記載

# まず開発環境を整える

## Box CLIをインストール

※引用：Box CLIはターミナルウィンドウまたはコマンドプロンプトからBox APIにリクエストを行うためのツールです。
要は、Boxの作業をコマンドで出来ますよってことです。

以下のリンク先にインストールする案内が記載されてます。

https://ja.developer.box.com/guides/cli/quick-start/install-and-configure/

以下のダウンロードってやつをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850787/0bcf4813-57ce-c42f-f596-bde36350f22d.png)


そしたらGitHubが開くので、該当するものをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850787/8439b78f-d323-c079-fc49-b90ebd9e64d3.png)

Box Developerのページに戻り、以下の赤文字部分を確認する
※要ログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850787/14789d17-a5c5-8d14-d281-6020f1ff2677.png)

PowerShellを起動し、以下を入力
```
box login -n test
```

IDとパスワードを求められるので、先ほどの赤文字部分を入力

これで開発環境が整いました。

## 実際に開発作業

PowerShellの知識については、調べたらわかるので割愛。
ChatGptに任せたら作成してくれるし、そんな苦労しないと思う。

## 作成したサンプルスクリプト

試しに指定したフォルダから最新のフォルダをコピーし、新たに最新のフォルダを作成するスクリプトを作成した
エラー処理もしていないし、汎用化できるようにもしていないので、サンプルとして見てもらいたい

### このスクリプトの前提条件

#### ファイル階層イメージ

- 1階層
    - 指定するフォルダ
- 2階層
    - 名前が`yyyyMMdd`+`Name`のフォルダ群
- 3階層
    - 名前が`Name`+`yyyyMMdd`のファイル単品

#### スクリプトの固定値説明

- `userID`にはBoxのユーザID（アカウントID）を入力
- `targetFdID`には指定したフォルダIDを入力
- `constFolderName`には作成するフォルダ名の`Name`を入力
- `constFileName`には作成するファイル名の`Name`を入力
- `constFileExtension`には作成するファイルの拡張子をドット付きで入力

```sh
 # 固定値
 $userID = 012345678910
 $targetFdID = 123456789
 $constFolderName = "Test"
 $constFileName = "Test"
 $constFileExtension = ".xlsx"
 $today = Get-Date -Format "yyyyMMdd"
 $folderName = $today + $constFolderName
 $fileName = $constFileName + $today + $constFileExtension

 # 以下処理
 #Boxログイン
 box configure:environments:switch-user $userID

 # 指定されたフォルダIDから最新のフォルダIDを取得
 $parentFdJson =  box folders:items $targetFdID --json --sort=date --fields=name
 $parentFdObjects = $parentFdJson | ConvertFrom-Json
 $parentFdObjects | ForEach-Object {$_.name = $_.name.substring(0, 8); $_ }
 $parentFdOfNewData = $parentFdObjects | ForEach-Object { $_.name }  | Sort-Object -Descending | Select-Object -First 1
 $parentFdOfNewID = ($parentFdObjects | Where-Object {$_.name -eq $parentFdOfNewData}).id
 
 # 最新のフォルダから新規フォルダをコピー
 box folders:copy $parentFdOfNewID $targetFdID --name=$folderName

 # 作成されたフォルダのIDを取得
 $createdFdJson =  box folders:items $targetFdID --json --sort=date --fields=name
 $createdFdObjects = $createdFdJson | ConvertFrom-Json
 $createdFdObjects | ForEach-Object {$_.name = $_.name.substring(0, 8); $_ }
 $createdFdData = $createdFdObjects | ForEach-Object { $_.name }  | Sort-Object -Descending | Select-Object -First 1
 $createdFdID = ($createdFdObjects | Where-Object {$_.name -eq $createdFdData}).id

 # 作成されたフォルダ内にあるファイルのIDを取得
 $createdFdInFileJson =  box folders:items $createdFdID --json --sort=date --fields=id
 $createdFdInFileObjects = $createdFdInFileJson | ConvertFrom-Json
 $createdFdInFileID = $createdFdInFileObjects | ForEach-Object { $_.id }

 # 取得したファイルIDを使用し、ファイル名を変更する
 box files:rename $createdFdInFileID "`"$fileName`""
```

処理の説明については、コメントを参照してほしい。
ChatGptに読み込ませたら一文一文の説明までしてくれると思う。

上記のスクリプトを`Windows PowerShell ISE`でコピペして保存すれば、PowerShellスクリプトファイル(`.ps1`)が作成される

## 作成したスクリプトをタスクスケジューラで自動実行させる

タスクスケジューラの登録方法については割愛。

ただ、PowerShellスクリプトの`ps1`ファイルをタスクスケジューラで実行させるには一手間必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850787/36ddd0c1-9bc4-1ae5-b925-8548ab892a7b.png)

- プログラム/スクリプト

PowerShellを起動し、以下のコマンドでPowerShellのパスを取得し、貼り付け

```sh
where.exe powershell
```

- 引数の追加

作成したスクリプトの絶対パスを `-Command "C:~"`形式で入力


※以下、参考リンク

https://soypocket.com/it/powershell/powershell-taskscheduler-set/


これで実行できるので、あとはタスクスケジューラで実行したいタイミング等を設定する

実行確認したいなら、作成したタスクを「右クリック→`実行する`」的な選択でできる。

お疲れ様でした。