
Tableauの.twbファイルからOmniのSemantic LayerのyamlのコードをClaude Codeで自動生成してみた
さがらです。
Omniのように新しいBIツールを導入することを考えた時に、一番のハードルになるのは「既存のBIツールからどのように移行するか」、だと思います。
しかし昨今の状況として、Claude CodeなどのAI技術の発展によりコード化・テキスト化されているコンテンツ間の移行であれば、やってみると意外となんとかなる状況になりつつあります。
そこで今回、TableauからOmniの移行という前提で、Tableauの.twbファイルからOmniのSemantic LayerのyamlのコードをClaude Codeで自動生成することを試してみました。その内容について本記事でまとめてみます。
前提条件
- 使用するDWH:Snowflake(AWS東京リージョン、Enterpriseエディション)
- TableauからSnowflakeに接続した
.twbファイルから、OmniでSnowflakeとのConnectionとベースとなるModelを作成した上で、移行を試してみます。
- TableauからSnowflakeに接続した
- Claude Code:2.1.70 (Proプラン、Opus 4.6を使用)
- Python環境:uv 0.10.9を使用
- 作成したSkillでPythonスクリプトを使用しているためPythonが必要です
- Tableau Desktop:2025.3.3
- ローカル環境:Ubuntu 24.04 LTS(WSL2を使用)
事前準備
まず、Omni、Tableau、Claude Code、それぞれで準備をしておきます。
Omni
Omniの事前準備としては、Tableauで使用しているSnowflakeとのConnection作成とベースとなるModelを作成して、Claude Codeから編集しやすくするようにModelのGit連携もしておきます。



Tableau
事前に以下のような.twbファイルを用意しておきます。
- 4つのテーブル間のリレーションシップを定義し、直近180日間の間で絞り込んだデータソースフィルターも設定

- 独自のディメンション・メジャー・パラメータを追加(日本語のディメンションが該当)
地域別_平均フルフィル日数など、LoDを用いたフィールドもあり


- ワークブック内で作成したダッシュボード

model-local-editorのインストール
Omniは通常インスタンス内のIDEで開発を行なうツールのため、ローカルで開発したものをOmni上で検証するためにはmodel-local-editorというツールをインストールする必要があります。
このツールは、常駐起動させることで、その間に編集されたファイルが全てOmniのインスタンス上に自動で連携される仕様となっています。
以下のブログで使い方をまとめているので、参考にしてみてください。
Claude Code(Skillの実装)
今回、Tableauの.twbファイルからOmniのyamlを生成するためのSkillを作成しています。実装方法としては、Claude Codeのskill-creatorのSkillでベースを作成してもらい、トライ&エラーを繰り返して修正していきました。
Skillの詳細は、以下のリポジトリで公開しているためこちらをご覧ください。
Claude Codeを用いた.twbファイルからOmniのyamlファイルの自動生成
Git連携したOmni用のリポジトリをローカル環境にクローンし、ブランチを切ります。その上でtableauフォルダを作ります。
その中に、移行対象のtableauワークブックファイル(.twbファイル)を入れます。

次に、model-local-editorを起動して、Omniのインスタンス上にローカルの編集内容が反映されるようにします。

この上でClaude Codeを起動し、まず事前準備で作成したSkillが適切に読み込まれているかを確認するため、/skillsを実行します。下図のように表示されれば問題ありません。

この上で、以下の内容でPlan modeで依頼してみます。 ※フォルダパスなどは、実態に合わせてください。
Skill「tableau-twb-to-omni-semantic-layer」を利用して、develop/manufacturing_dataops_test/tableau フォルダ内の.twbファイルを元に、Omni移行用の各ファイルを生成して
下図のようにプランを作成してくれたので、コード生成を依頼します。

コード生成完了後、各種コードを確認します。以下は今回生成されたコードの一例です。
- 既存のViewファイルにdimensions/measures/filters定義が追加されている


- データソースごとにTopicを生成

- Tableauの各ワークシート・ダッシュボードをOmni上でどう再現するかの手順をまとめたMarkdownファイルを生成



この後、Git操作を行い、mainブランチを最新の内容に更新します。
Omni上で動作確認
今回はmodel-local-editorを使用していたので、指定したブランチでOmniにもClaude Codeで生成したコードが反映されています。

この状態でExploreを押し、Tableauで作成していたグラフが再現できるかどうかを、Claude Codeが作成したMarkdownファイルに沿って行ってみます。
各Queryでグラフを再現すると、TableauのデータソースフィルタはTopicのデフォルトフィルタとして適用されており、メジャーを切り替えるパラメータやLoDフィールドも想定通りに機能していることがわかります。



最後に、ダッシュボードも作成してみます。フィルタや凡例の位置などは異なりますが、機能面としてはTableauのダッシュボードと同等の内容を網羅していると思います。

おまけ:検証中のトラブルの一例
この記事ではうまくいったところだけ書いていますが、検証中は色んなトラブルがありましたので、都度エラーログをClaude Codeに与えてSkillを修正していきました。(少なくとも10回以上はこのコード生成⇛Skill修正のループを繰り返したはずです…)
以下、実際にあったトラブルの一例です。
- OmniのSemantic Layerのコード上、存在しないパラメータを勝手に使ってしまい、model-local-editorのSync時にエラーログが出てしまう
- 例1:
aggregation_typeについて、存在しない値を指定してしまう - 例2:LoDフィールドをOmniの構文に沿って作ってくれない
- 例1:
- Syncがうまくいっても、Omniの画面上でエラー・警告になる
- 例1:LoDフィールドで使用しているフィールドをtopicで使用するフィールド一覧に入れてなかった
- 例2:Omniのフィルター用フィールドを
filters:に定義済なのに、dimensions:でも入れてしまう - 例3:
aggregate_type: count_distinctのメジャーなのに、sql:でCOUNT DISTINCTを行っている
最後に
Claude Codeを活用してTableauの.twbファイルからOmniのSemantic Layerのyamlコードを自動生成する取り組みを試してみました。
ダッシュボード自体の自動移行までは実現できていないものの、Semantic Layerの定義やTopicの生成、さらにはOmni上でのグラフ再現手順のMarkdown作成まで自動化できたことで、移行作業の大部分を効率化できる手応えを感じました。
特に、TableauのデータソースフィルタやLoDフィールド、パラメータといった複雑な定義も、Skillの改善を重ねることでOmni側で再現できるようになった点は大きな収穫です。
一方で、一発で完璧なコードが生成されるわけではなく、Skillの修正を何度も繰り返す必要がありました。私も今回試した.twbファイルではうまくいきましたが、別の.twbファイルでは都度調整が必要となるかもしれません…
しかし、腰が重くなりがちなBIツールの移行について、AI技術の進歩により「コード化されたもの同士の移行」は現実的な選択肢になりつつあります。
本記事がBIツール移行を考える方の一助になると幸いです。








