Tableau Online上のワークブックをtabcmdでローカルにバックアップする

#はじめに

Tableau Onlineは一度削除したワークブックを復活させられない仕様です。（2020/10現在）
何らかの拍子に謝って削除してしまった場合、元に戻せません・・・(´；ω；｀)ﾌﾞﾜｯ
その場合考えられる対策は3つありますが、今回は3つめの **tabcmdでワークブックをローカルに保存する仕組みをつくる** について詳しく紹介します。

**対策1. 削除権限を最低限のユーザーのみに適用する（削除リスクを減らす予防線）**
    - 間違って削除しちゃった！というユーザーの人的ミスを減らします。
    - コンテンツの画面から[...] > [パーミッション]で、各種権限設定ができます。詳しくは[こちら](https://help.tableau.com/current/online/ja-jp/permissions.htm)
    -  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/864fda6b-a6b9-eda6-8795-037c825e5ecb.png)

**対策2. マスターファイルとなるtwbxファイルは常にローカルに保存しておく**
    - べたな解決策ですが、Tableau Onlineにアップロードするファイルは常にローカルにも保存しておきましょう、という方法です。
    - とはいえ、この方法だとTableau Onlineにパブリッシュしたワークブックがどんどん編集されて更新される場合、最初にパブリッシュしたファイルとは別物になっているリスクもあります。
     
**対策3. tabcmdでワークブックをローカルに保存する仕組みを作る**
    - Tableau Server/ Tableau Onlineで利用できるコマンドラインユーティリティです。
    - バックアップとしてワークブックをローカルに保存できます。スケジューラー登録すれば自動化も◎

tabcmdコマンドラインユーティリティツールを活用すれば、色んなことが自動化できます！


#ちなみに


Tableau Onlineで削除してしまったものを復活させる機能の実装について
Tableauコミュニティで120票以上投票が集まっています。現在開発チームがレビュー中とのことで、今後の実装に期待できるかも？

[Undo Delete / Trash / Recover - Tableau Online](https://community.tableau.com/s/idea/0874T000000HCprQAG/detail)



#tabcmdの下準備

###そもそもtabcmdとは

tabcmdコマンドラインユーティリティツールで、これを活用すれば色んなことが自動化できます。
tabcmdコマンド一覧は[こちら](https://help.tableau.com/current/online/ja-jp/tabcmd_cmd.htm)。ユーザー追加やワークブック・データソースのパブリッシュなど色々できます。

###tabcmdをインストールする

Tableau Onlineでは常に最新の製品バージョンが適用されています。
以下のサイトから最も最新のバージョンを選択し、tabcmdをインストールします。

例：いまは2020.4が最新なので・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/de79c976-42ef-e86e-02ee-1d127edd8e62.png)

↓
Windows or Linuxのインストーラーを選択します。
サポート対象外ですが、Linuxを選択すればMacOSでも動くようです。（参考：[クラスメソッドさんの記事](https://dev.classmethod.jp/articles/tableau-tabcmd-mac/)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/ea016fa9-60e1-2d18-19cc-7d45555593fd.png)



### 環境変数パスを追加する（オプション）

インストール時のデフォルトのパスは C:\Program Files\Tableau\Tableau Server\2019.4\extras\Command Line Utility\ です。
このディレクトリに移動すればtabcmdが使用できますが、毎回移動するのも面倒ですので環境変数パスを追加しておきます。

[コントロールパネル] > [システムとセキュリティ] > [システム] > [システムの詳細設定]

環境変数をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/52fe4941-8140-2003-dd68-1a9643e218e9.png)

システム環境変数にあるPathをクリックし、編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/35b940f2-b404-eb9e-2157-6f1f90063f76.png)

[新規]から、上記のパスを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/6d8525cf-8937-5aad-d852-6572329c985b.png)

これで、どのディレクトリからでもtabcmdコマンドを使うことができるようになりました！


#ワークブックを取得するコマンドを打つ

[tabcmdには色々コマンドがありますが](https://help.tableau.com/current/online/ja-jp/tabcmd_cmd.htm)、ワークブックを取得するコマンドは**get**です。

###ログインする

getするにせよまずはTableau Onlineにログインしないと始まりませんので、ログインしましょう。

```tabcmd login -s <Tableau Online URL> -u "<ユーザー名>" -p "<パスワード>" -t <サイト名>```

- Tableau Online URLには、Tableau Online URL部分の`https://prod-apnortheast-a.online.tableau.com`に該当する内容を記載します。
- <ユーザー名>と<パスワード>は普段Tableau Onlineにログインする情報でOK。 ""で囲ってあげるとエラー知らずです。
- <サイト名>は、Tableau Onlineのサイトを1つしか持ってない場合は指定不要だと思いますが、もし複数サイト持っている場合は指定してあげましょう。Tableau OnlineのURL部分に記載されている固有の名前です。

```loginコマンド実行結果
C:\Users\yourname>tabcmd login -s https://prod-apnortheast-a.online.tableau.com -u "username" -p "password" -t sitename
===== 新しいセッションを作成しています
=====     Server:   https://prod-apnortheast-a.online.tableau.com
=====     Username: username
=====     Site:    sitename
===== サーバーに接続しています...
===== サインインしています...
===== 正常に終了しました
```

###getする

ワークブックをダウンロードします。
Tableau Onlineには[検索]というところからフォルダ（プロジェクト）が階層構造になっていますが、
どのプロジェクトの中のワークブックか？というのは意識しなくて良さそうです。（というかできない？）

`tabcmd get "ワークブックのパス" -f "保存するディレクトリ"`
保存するディレクトリは指定しなくてもOKです。指定しない場合は作業中のディレクトリに保存されます。
ワークブック名にスペースが入っているとそこで止まってしまうので、""で囲みましょう。
**"/workbooks/<ワークブック名>.twbx"**で大丈夫だと思います。

Regionalというワークブックを取得してみます。

```
C:\Users\yourname\Downloads>tabcmd get "/workbooks/Regional.twbx"
===== 前のセッションを続行しています
=====     Server:   https://prod-apnortheast-a.online.tableau.com
=====     Username: username
=====     Site:     sitename
===== サーバーから '/workbooks/Regional.twbx' を要求しています...
===== 添付ファイルが見つかりました: Regional.twbx
===== /workbooks/Regional.twbx を 'Regional.twbx' に保存しました
```


私の環境では日本語ファイル名のワークブックをgetしようとすると何回やってもエラーが・・・涙 仕様かな？

```
C:\Users\yourname\Downloads>tabcmd get /workbooks/"ボストン予測.twbx"
===== 前のセッションを続行しています
=====     Server:   https://prod-apnortheast-a.online.tableau.com
=====     Username: username
=====     Site:     sitename
===== サーバーから '/workbooks/%E3%83%9C%E3%82%B9%E3%83%88%E3%83%B3%E4%BA%88%E6%B8%AC.twbx' を要求しています...
  *** サーバーからの予期しない応答: 404 null

```

個人的な所感としては、getコマンドでローカルに保存するときには、ワークブック名は
英語にする & Tableau Onlineサイト内でユニークなファイル名にしておく　と良いかと思います。

なお、getコマンドでワークブックを取得するにはもともとのワークブックの
上書き保存権限とダウンロード権限が必要です。エラーでひっかかる場合はチェックしましょう。


#バッチファイルにして自動実行する

あとはお好みです。上記のコマンド実行例ではloginとgetを実行しましたが、↓のように記述して保存すれば、
Windowsのタスクスケジューラなどで決まったタイミングでワークブックをバックアップとして取得できます。

```bat:自動化.bat
tabcmd login -s https://prod-apnortheast-a.online.tableau.com -u "username" -p "password" -t sitename
tabcmd get "/workbooks/<ワークブック名>.twbx"
```


#おわりに

Tableau Online上のワークブックを、tabcmdコマンドを利用してローカルPCに保存（バックアップ）する方法をご紹介しました。
定期的なバックアップの取得の参考になればと思います。