システム連携ネタでよくブログを書いている日下です。

あるお客様より Excel Online にデータ出力できないかと相談をいただき、調査したところ実現できました。以下、その連携の設定方法についてまとめます。

2020/10/28現在 この記事で説明している形とは若干異なりますが、Excel にデータ挿入できるアドオンが公開されています。こちらも参考にしてください。
アドオン:Microsoft 365 Excel: 行挿入
目次
1: Excel Online と Questetra の連携検討の背景
2: Excel Online と Questetra を連携するための設定
 2.1: Excel Online(Office 365) 側の OAuth 設定
 2.2: Questetra 側の OAuth 設定
3: Questetra から Excel Online API を呼び出す設定
 3.1: Excel Online のシートアクセスのための準備
 3.2: Excel Online のシートの値更新
4: まとめ

1: Excel Online と Questetra の連携検討の背景

Questetra で流したデータをシートに順に出力したい、ということで、過去に Google Sheets では実現できていたケースになります。ニーズとしてはよくあるケースの1つと言えます。

※関連アドオン xml:「Google スプレッドシート: 行追加」

2: Excel Online と Questetra を連携するための設定

Excel Online に限らず Office 365 との連携については、以前にまとめた記事があります。
※関連記事:Office 365 とクラウド型ワークフローとの連携方法について
この記事に書いた通り、認証については AzureAD v2.0 endpoint で Authorization Code を使う場合、Questetra 側は OAuth2 の設定のみで対応できます。 今回もその方法で実現できました。

2.1: Excel Online(Office 365) 側の OAuth 設定

以下の記事を参考にして「クライアントID」、「クライアントシークレット」を取得してください。
 「Office 365 とクラウドワークフロー Questetra を API 連携させたい場合に(Office 365 でのアプリケーション登録手順)」

2.2: Questetra 側の OAuth 設定

以下の記事の「2.2: Questetra 側の OAuth 設定」と同じです。記事を参考にして設定してください。「スコープ」も OneDrive のケースと同じもので問題ありません。
 「OneDrive へクラウドワークフロー Questetra からファイル出力する方法」

3: Questetra から Excel Online API を呼び出す設定

前準備がいろいろ大変です。対象となる Excel ブックはあらかじめ手動で作成している想定です。
(Google Sheets の場合はそのシートのアクセス URL から API アクセスに必要なシートの id が取れるのですが、Excel Online の場合はアクセス URL には違う id が入っててカンタンには取れない・・・)
また、今回は Excel ブックの「テーブル」を使います。Excel の「テーブル」って何?という方は Web 検索してみてください。 なぜ「テーブル」が必要かですが、Excel のセルの値を更新する API としては、シートのセルの位置を指定して更新する API と、テーブルを指定して行追加する API があり、今回は後者の方がやりやすかったためです。ということで、「テーブル」も手動で作成しておいてください。

準備について整理すると以下の通り。

  • Excel Online のシート内のセルの値を更新するために、table-id(Excel ブックの「テーブル」の ID)が必要
  • table-id を入手するために worksheet-id(Excel ブックの中のシートの ID)が必要
  • worksheet-id を入手するために workbook-id(Excel ブックの ID)が必要
  • workbook-id を入手するために OneDrive の API で DriveItem の一覧の取得が必要
  • DriveItem の一覧取得のために、OneDrive のマイドライブからアクセス要
    (DriveItem 一覧はフォルダごとの取得になるため、対象の Excel ブックがマイドライブ直下にない場合、フォルダをたどっていく必要あり。そのたびに DriveItem 一覧の取得しないといけない・・・)

まず前半でアクセスに必要な情報をそろえて、後半でデータの更新について説明します。

3.1: Excel Online のシートアクセスのための準備

少しでもラクに準備できるよう Questetra のワークフローアプリで、table-id を取るところまでを作りました。3.2 で必要となる情報は workbook-id と table-id です。
以下からこのワークフローアプリのアーカイブをダウンロードできます。
 ワークフローアプリのアーカイブ(Excel Online の id 取得)
※zip を展開すると qar ファイルが入ってします。アーカイブはテンプレートとしてインポートできます。詳しくは「初めての業務テンプレート活用」を参考にしてください。また、動かすためには各「メッセージ送信中間イベント(HTTP)」の OAuth 設定が必要です。
※このワークフローアプリでは、必須チェックとかエラー処理はあまり厳密にはしていません。例えば DriveItems を選択しないとエラーになるとか、選択したファイルが Excel ブック以外だとエラーになります。その辺りはご了承ください。

具体的に何をしているかをざっと解説すると以下の通り。
(1) 以下を GET でたたいてレスポンスから drive-id 取得

https://graph.microsoft.com/v1.0/me/drive

(2) 取得した drive-id を元にして以下を GET でたたいて DriveItem のリスト取得

https://graph.microsoft.com/v1.0/drives/{drive-id}/root/children

(3) 取得した DriveItem のリストから対象を選択(対象ファイルが Excel の場合、driveitem-id が workbook-id になる)
 選択した対象がファイルなら以下を GET でたたいて worksheet-id のリスト取得

https://graph.microsoft.com/v1.0/me/drive/items/{workbook-id}/workbook/worksheets

 選択した対象がフォルダなら以下を GET でたたいて DriveItems 取得して再度 (3) の頭に戻る

https://graph.microsoft.com/v1.0/me/drive/items/{driveitem-id}/children

(4) 取得した worksheet-id のリストから対象を選択

(5) 以下を GET でたたいてセルの値を取得
(この処理はなくてもいいのですが、wroksheet-id が意図通りのものか確認するために入れました)
(「{」・「}」を URL エンコードした「%7B」・「%7D」が必要なのって API の実装ミスじゃないかと思ってしまうのですが・・・)

https://graph.microsoft.com/v1.0/me/drive/items/{wokbook-id}/workbook/worksheets('%7B{worksheet-id}%7D')/range(address='A1')

(6) 以下を GET でたたいて table のリスト取得

https://graph.microsoft.com/v1.0/me/drive/items/{workbook-id}/workbook/worksheets('%7B{worksheet-id}%7D')/tables

(7) 取得したテーブルのリストから対象テーブルの table-id 取得

※以下ドキュメントを見ていると、HTTP ヘッダとして workbook-session-id: {session-id} を使用するよう記載があります。
 Microsoft Graph での Excel の操作
が、よく読むと以下の記載があり、その指定が必須ではなく、指定なしでも API をたたくことができました。
——————————
注: セッション ヘッダーは Excel API が機能するために必要ではありません。しかし、パフォーマンスを向上させるためにセッション ヘッダーを使用することをお勧めします。セッション ヘッダーを使用しない場合は、API の呼び出し時に行われた変更がファイルに永続化_されます_。
——————————
※Questetra では HTTP ヘッダの指定ができるのですが、ホワイトリスト方式のため、現状では上記ヘッダは許可されていません。ご注意ください

3.2: Excel Online のシートの値更新

ようやく前準備が完了しました。
今回は簡単にするため2項目だけの「テーブル」の行を追加することにします。

以下のような JSON データを POST するとセルに値が入ります。

https://graph.microsoft.com/v1.0/me/drive/items/{workbook-id}/workbook/tables('%7B{table-id}%7D')/rows
{ "values": [ [ "{data1}", "{data2}" ] ], "index": null }

Questetra のワークフローアプリにすると以下のような感じ。
以下からこのワークフローアプリのアーカイブをダウンロードできます。
  ワークフローアプリのアーカイブ(Excel Online の table 行追加)

以下のようにうまくいきました。

4: まとめ

なかなか大変でした。これまでいろんな API を見てきたのですが、Office365 は最強クラスかと思います。

Excel については、Google Sheets で実現したような、シートの一覧から業務プロセスの一括開始したい、といったニーズもあると考えています。
Google Sheets であれば Google Apps Script を埋め込むことで実現できました (すぐに使えるよう Google Sheets の add-on も作成しました)。
※参考記事:「Googleスプレッドシート(Google Sheets)でワークフローを一括開始させる方法」

残念ながら、Excel Online にはまだそのような仕組みはないようですので、API でがんばるか、Office addin の仕組みでできそうか調べてみる、という感じになりそうです。実現できれば記事にまとめたいと思います。
※ちなみにクライアントアプリケーションの Excel からであれば VBA で実現できます。

なかなか道は険しい感じですが、Office 365 でのご相談が最近はかなり多いので、事例を増やしていきたいと考えています。

もし、ご質問等がありましたら、お問い合わせフォームからお気軽にご連絡ください。

※参考ドキュメント
「Microsoft Graph でのファイルの作業」
「Microsoft Graph での Excel の操作」

%d人のブロガーが「いいね」をつけました。