Google Apps ScriptとMicrosoft Graph APIの連携 - データ取得編【GAS】
前回、Microsoft Graph APIのOAuth2.0認証を取得する所まで用意することが出来ました。今回はそれに引き続き、OneDriveに配置してあるExcelファイルからデータを取得して、自身のスプレッドシートに書き込みまでを実装してみました。
ただし、Googleのそれとは文化がだいぶ異なるのと、REST APIを叩くことで操作をする方式なので、GASの流儀で操作は出来ません。単純にデータを取得して貼り付けてるだけなので、より発展的な操作をするためには何度もAPIを叩く必要があるので、少し面倒ですね。
リンク
今回使用するファイルとサイト
- Graph APIにアクセスするスプレッドシート
- アクセスするExcelファイル on OneDrive
- Microsoft Graph エクスプローラ
- Microsoft Graph API リファレンス
- eStat - 第21回医療経済実態調査医療機関等調査 統計データ
今回はOneDriveルート直下のファイルにアクセスします。データはeStatの統計データを入れてあります。
事前準備
OneDriveやSharePointはローカルのファイルサーバと同じく、同じディレクトリ内に同じファイル名が存在できないルールになっています。また、Microsoft365のExcelのURLにはファイルIDが含まれておらず、事前にMicrosoft Graph Explorerからクエリを実行して、対象のファイルのIDを取得しておく必要があります。(GASのようなメソッドチェーンでURLからID取得するようなことが出来ないのが不便)
ファイルのIDを取得する手順は以下の通り。
- Graph Explorerサイトを開き、自分のアカウントでサインインする。
- GETにて、「https://graph.microsoft.com/v1.0/me/drive/root/children」を実行。今回は、OneDriveルート直下のxlsxを調べます。
- 検索結果が応答のプレビューに出てくるので、対象のファイルのidを控えておく。
- 特定のフォルダ内のファイルを調べる場合には、rootの部分にフォルダのIDを入れて調べる。
図:ちょっと手間の掛かる手順が必要。
1 2 3 4 5 6 |
{@odata.context=https://graph.microsoft.com/v1.0/$metadata#users('c9322986-6a70-4c29-b6f4-63e8e46f866f')/drive/items('01AAJRRAG5LIQKDSXKDVF2WHCRJMJ5LTT4')/workbook/worksheets, value=[ {@odata.id=/users('c9322986-6a70-4c29-b6f4-63e8e46f866f')/drive/items('01AAJRRAG5LIQKDSXKDVF2WHCRJMJ5LTT4')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27), visibility=Visible, name=統計データ, id={00000000-0001-0000-0000-000000000000}, position=0}, {@odata.id=/users('c9322986-6a70-4c29-b6f4-63e8e46f866f')/drive/items('01AAJRRAG5LIQKDSXKDVF2WHCRJMJ5LTT4')/workbook/worksheets(%27%7B467CE256-F0F4-43BD-95CA-372E4A759B39%7D%27), visibility=Visible, name=テスト, id={467CE256-F0F4-43BD-95CA-372E4A759B39}, position=1} ] } |
結果:試しにシート一覧を取得してみた。
コードと実行結果
GAS側コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
//ターゲットファイルの設定 var fileid = "ここにファイルのIDをいれてください。"; //APIを叩くルーチン function graphapicall(method, eUrl) { //Graph APIサービスを取得する var service = checkOAuth(); if (service.hasAccess()) { //HTTP通信 var response = UrlFetchApp.fetch(eUrl, { headers: { Authorization: "Bearer " + service.getAccessToken() }, method: method, contentType: "application/json" }); //取得した値を返す return JSON.parse(response.getContentText()); }else{ //エラーを返す(認証が実行されていない場合) return "error"; } } //Excelファイルからデータを取得する function getsheetdata() { //書き込み先シートを取得する var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1") var ui = SpreadsheetApp.getUi(); //Graph APIサービスを取得する var service = checkOAuth(); if (service.hasAccess()) { //Excelのワークシートを取得する var sheetname = "統計データ"; var range = "a3:e12"; var excelfile = endpoint + "/me/drive/items/" + fileid + "/workbook/worksheets('" + sheetname + "')/range(address='" + range + "')?$select=values "; var xlsx = graphapicall("GET", excelfile); //ワークシートデータを配列で取得する var sdata = xlsx.values //配列の縦横の数を取得する var row = sdata.length; //レコード数を取得 var column = sdata[0].length; //カラムの数を取得 ss.getRange(3,1,row,column).setValues(sdata); //終了処理 ui.alert("データを取得しました。") } else { ui.alert("認証が実行されていませんよ。"); } } |
- データは通常の配列データで返ってきますので、扱いは簡単です。
- endpointに様々なURL情報を付け加えるのですが、ワークシートはシート名指定で行けます。レンジの範囲も通常のExcel上の範囲指定と同じ形式が利用できます。
- worksheets(シート名)/usedrangeにて、データのある最終行を取得出来ます。
実行結果
メニューより、「Excelデータ」⇒「データの取得」を実行します。実行すると、OneDrive上のExcelからデータをひっこぬいて、Googleスプレッドシート側に書き込まれます。
図:そっくりそのままコピーしてきました。