【Alteryx】ワークフローを実行するたびにテンプレートファイルをコピーしてデータ出力する方法

2022.01.31

こんにちは、まつおかです。

今回はExcelで作成したテンプレートファイルをワークフロー内でコピーし、新たにできたファイルにデータを出力する方法をご紹介します。
ユースケースとしては、ワークフローを実行するたびに新規でファイルを作成しデータ出力したいけどテンプレートは決まった様式を使用したいといった場合が挙げられます。

前提

以下の前提でワークフローを作成します。

  • PCはWindows 10 Pro、Alteryx Designerは2021.3.4を使用
  • すでにExcelのテンプレートファイルが用意されている状態
  • コピーして作成するファイルの名称は「copy_datetime」
    datetime部分はファイル作成時の情報となるため可変
    例:copy_20220131112459.xlsx
  • 複製したファイルはテンプレートファイルと同じディレクトリに格納

今回のテンプレートファイルは以下のように書式設定された表になっています。
「OutputData」は出力データ、「datetime」は出力時の日時、「filename」は出力ファイル名を出力します。

早速ワークフローです

作成したワークフローの全容はこちら!

処理は大きく分けてテンプレートファイルをコピーしているフローと、出力データにファイル情報を付加するフロー、最後にデータを出力するフローの3つとなります。

テンプレートファイルコピー

まずは今回の処理の要となるテンプレートファイルのコピー部分です。

ファイルのコピーは、コマンド実行ツール(Run Command)を使用しWindowsのcopyコマンドを実行するという方法で実現可能です。そのために事前にコピー後のファイル名を作成することとコマンド文を作成する必要があります。コマンド実行ツールでは作成したコマンド文をバッチファイルとして出力し実行します。

最初のテキスト入力ツールでは、テンプレートとなるファイルのパスとファイル名を予め設定しています。

次のフォーミュラツールで、テンプレートをコピーして新規に作成するファイル名の作成と、実行するコマンド文を作成しています。
「DateTimeNow()」関数で現在の日時を取得し、「DateTimeFormat()」関数で書式を整えつつファイル名を作成します。日時取得とファイル名作成は同時に記載してもOKです。最後にcopyコマンドの文を作成しています。

この時点で5列ある状態ですが、必要なのはcmd列のみですので、次のセレクトツールで不要な列を削除します。
続いて、cmd列だけになったデータをコマンド実行ツールに渡します。

設定の上部、出力ボタンをクリックすると以下のウィンドウが開きます。ここでは作成したコマンド文を出力する設定をします。ファイル名は任意の名称で問題ありませんが、拡張子が「.bat」のバッチファイル形式とする必要があります。ただ、ファイル形式の選択肢の中にバッチファイルがありませんので、ここはcsvファイル形式を選択してください。
また、コマンド文にフィールド名は不要ですので、オプション4つ目の「先頭行にフィールド名を含める」のチェックは外してください

設定画面中部の「外部プログラムを実行」の「コマンド」の部分には、先程出力設定したバッチファイルを指定します。
最後の「結果の読み取り」には、テンプレートファイルを指定します。入力ボタンをクリックすると以下のウィンドウが開きます。

こちらで読み込んだファイルのデータがコマンド実行ツールの出力データとなるのですが、テンプレートファイルを指定しているのでデータは空(正確に言うと罫線が引かれた行は読み込まれるので、今回の場合Nullが入っている行が数行読み込まれます)です。空のデータをなぜ出力するのか?については、後ほどご説明します!

ちなみに、入力ファイルに何も指定しないことでコマンド実行ツールから何も出力しない設定にすることも可能です。ここで処理を終わらせたい場合は設定の必要はありません。

ここまでがテンプレートファイルのコピー処理になります。

出力データにファイル情報を付加

続いて、出力データにファイル情報を付加します。
今回は出力のたびにファイル名が変わります。この場合は出力データにファイル情報を設定する列を追加し、最後のデータ出力時にその列からファイル情報を取得し出力するという方法を取ります。

テキスト入力ツールには出力対象のデータが入っています。実際のワークフローではここまでにデータを読込み加工し、、、という処理が入る想定です。
その下のセレクトツールでは、このあと必要となる出力ファイルのパスと、一つ前のフォーミュラツールで作成した日時とファイル名のみの列に絞ります。
次に繋がるフィールド付加ツールで、出力データにファイル情報を付加しています。フィールド付加ツールについてはこちらをご参照ください。

以下が出力データ(2行)に出力ファイルのパスと、日時、ファイル名の列が付加された状態です。

次のフォーミュラツールではパスとファイル名を連結しています。Excelファイルへの出力はシート名の指定が必要であるのに加え、今回はデータ出力先がテンプレートの表の部分となりますので、セル情報も付加する必要があります。

あとはセレクトツールにて不要な列を除外し、データの準備は完了です。

データ出力

最後にデータ出力部分です。
まずは、出力データとコマンド実行ツールから出てきた空のデータをユニオンし、さらに完了までブロックツールを挟むという謎のつくりになっている理由をご説明します。

Alteryxは一部のツールでの処理を除き、各ツールの処理が終わったレコードからどんどん先のツールに流れていき順次処理していく動きをしているのですが、完了までブロックツールを置くことで全レコードが揃うまで次のツールに流さずストップさせることが可能になります。
完了までブロックツールの詳細は以下のページをご参照ください。

コマンド実行ツールは指定したコマンドを実行した後、入力に指定したファイル(今回の場合はテンプレートファイル)を読込み、ツールから出力します。
コマンド実行ツールから出力されたデータと出力データをユニオンし、完了までブロックツールで一旦データを蓄積するということは、その時点でcopyコマンドは既に実行されたということになります。ということは、データ出力時点で出力対象のファイルがないという事態を防げるということです!
ファイルがコピーされる前にデータを出力しようとしてしまった場合はエラーが発生してしまいます。そいういった事態を防ぐため、出力前までの処理が一通り終わるまでブロックするという処理を入れています。
これで無事、出力対象のファイルが用意された状態で、あとはフィルターツールでテンプレートファイルから読み込まれた空の行を除外し、データを出力します。

データ出力ツールでは書き込み先にテンプレートファイルを指定していますが、実際はデータのフィールド(outfile)から取得しますので、設定下部にある「フィールドからファイル/テーブル名を取得する」にチェックを入れ、プルダウンから「ファイルパス全体を変更する」を選択、フィールドに「outfile」を指定してください。
また、オプションの3番目「出力オプション」は「シートまたは範囲を上書きする」を選択、5番目のフィールド名はスキップする設定に、6番目の書式設定もチェックを入れて書式を保持する設定にしてください。

実際に出力したファイルがこちらです。テンプレートをコピーし作成したファイルに、書式はそのままでデータのみが出力されています。

さいごに

今回はテンプレートファイルは特定のファイル、出力ファイル名も可変とは言え日時を付加しただけのものという基本的な動作をご紹介しましたが、インターフェースツール使うことで実行のたびにテンプレートファイルを指定したり、出力ファイル名を自由に入力したりといった更に幅の広がるワークフローの作成が可能となります。
Alteryxでできること、いっぱいありますので是非いろいろお試しください!