【Excelアドイン】Excelワークシート上からスケジュールタスクを実行してみる

今回は、Excelワークシートから[Sharperlight](https://sharperlight.jp/)スケジューラで定義したタスクを実行してみます。

スケジューラのタスクであるAPIからデータを取得し、自分のデータベースに保存するといった同期処理を実行させている場合があります。もちろん時間を指定して、例えば毎朝5時とか定期的にタスクを実行させるでしょう。レポーティングはその同期されたデータベースに対して行います。ただ、例えばExcel上に作成されたレポートで、再計算を行っても早朝5時に同期されたデータではもう古く、最新のデータが欲しく、手動でタスクを実行したい場合があるでしょう。
そういった場合、いちいちスケジューラを起動してタスクを実行するのは手間ですよね。そういった場合の対処方法を紹介しようと思います。
何をするかは至って簡単！ボタンをポチっで実行:grin:

更に今回は、Sharperlightクライアントからリモート接続でSharperlightサーバーに接続しているといった環境で説明します。Sharperlightインストール環境でExcelを使用する場合は、こういったケースがほとんどだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6414493a-e345-fda3-90ea-a4ca83d9abe3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/253f3790-0a5b-617f-71e6-acbd1f0ca909.png)
### タスクを実行するクエリの作成 ###
ではExcelを起動します。適当なセルを選択し、Sharperlightリボンから**テーブル**数式を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7175bb57-62c6-2c48-2b1a-e4823288dd86.png)
お馴染みの**クエリビルダ**が起動します。
`製品`には**System**を、これはもちろんリモート接続先のSharperlightサーバーのSystemです。`テーブル`には**タスクの実行**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/af362027-a0dc-974b-024c-630749cf89ae.png)
`ユニークコード`には実行するタスクの**グループ名**と**コード**をこのような書式：**グループ名.コード**で指定します。
指定するタスクはもちろんSharperlightサーバー側にあります。
この記事用に`_Test.RunFromExcel`という名称でこのようなアクションを定義しました。
##### 実行するタスクの説明 #####
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8ba5dcf6-66f6-348e-bade-ff9e2226d4b8.png)
タスクの開始を記すログアクション、20秒処理を待つアクション、そして最後はタスクの終了を記すログアクションです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fb3d1b5a-26f2-6731-5820-395c410eb8f2.png)
最後に`セキュリティ`タブで実行許可を与えます。今回、パスワードは省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e609d1ad-27d9-1fac-8f80-7c850bdacf79.png)
### タスクを実行するクエリの作成（続き） ###
上記で紹介したタスクをこのようにExcel側のクエリで指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1926ce0c-27fb-e757-607c-1f2fb58243a6.png)
更に`モード`を選択領域からフィルターに設定し、フィルター値には**Synchronus**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/187a6503-0846-6d5c-583a-dcaab84f9610.png)
出力する列は、最終的にはこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eca7a4e5-b963-c6bd-3f41-76f4c44c6c7d.png)
選択領域から`ユニークコード`を出力領域に設定し、説明を**実行したタスク**と変更します。
選択領域から`応答`を出力領域に設定します。応答はタスクの実行に要した時間が秒単位で返ってきます。そのままでは、Text値として戻ってくるのでExcel上で数値として扱いたかったので、すぐ下に定義した`拡張表現`で数値に変換します。そしてこのオリジナルは表示不要なので非表示(Hidden)にします。

`拡張表現`の内容、Val( )関数で数値に変換している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/63aa39d6-8593-45b0-0d53-c8c16affd121.png)

次にサブクエリを利用して、タスクを開始した時間と終了した時間を取得して表示してみました。
サブクエリはこのようになっています。`実行の近況`テーブルを利用して、開始日時(%StartDT)と終了日時(%EndDT)を取得しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5c1403e3-9993-27be-40ac-999b21a0968c.png)
これを親クエリ側で拡張表現を使用して取り出して表示させています。開始日時はこのようになっています。終了日時も同じような設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e96c5f5c-075b-4fdc-36ce-b2c0b1f5cf7b.png)
サブクエリの表示は必要ないので、非表示(Hidden)にします。
`OK`ボタンで確定、実行します。20数秒間処理が実行され、このような表が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8e69104f-f646-9367-6685-93d0a44f6fc6.png)
Total行が表示される場合は、ExcelのTable Design機能でオフにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f7dd2f5e-1d46-517e-c75a-5e6bd15c8216.png)
クエリ作成開始時に選択したセルが**D5**だったので、セル**D5**にテーブル数式が定義されています。
このままではワークシートに何かの変更が加わる度にこの数式が実行されてしまうので、遅延数式に変換します。
数式名の後ろにDLを付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c068294a-4b2f-c47f-8a25-7638f9fddd26.png)
列名`Seconds Taken`が英語なので、日本語にします。セル**D5**をダブルクリックして**クエリビルダ**を起動し、このように説明を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2c80b99c-7031-9097-5dcc-196aee67aad0.png)
あとは、Excel側で経過時間の小数点以下を3桁にしてテーブルはこれで完成！
### ボタンを追加 ###
セルB3を選択し、右クリックメニューから`Sharperlight XL` -> `Edit Button/Table Bindings`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/93b2199e-88e5-815d-3954-e3ab7b125e50.png)
**Button Table Binding**ダイアログが表示されます。
先ず、+(プラス)アイコンをクリックして、ボタンを追加します。次にQuery Name(クエリの名称)、数式の定義されているセル、Table Name(テーブル名)を記入して、`OK`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3582e9f9-4367-623c-6311-ae313b414976.png)
ボタンのキャプションを**タスク実行**に変更します。
ボタンをクリックすると数式がタスクを実行します。ボタンに数式を結びつけ実行を確認した後は、数式はワークシート上に不必要になるのでセル**D5**から削除します。

以上で、Excelからタスクを実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/407589c5-b27d-94dc-f740-481dbe4bfb96.png)

では、失礼します。