こんにちは。
ごすけです。
私が勤めている会社の経理から「製造現場が原料管理で使用しているZAICOというアプリのデータを自動でスプレッドシートに反映してほしい」と相談があり、ググりながら実装しました。
今回は実装したGoogle Apps Script(以降GAS)を使ってWeb APIを取得し、スプレッドシートに反映するコードを紹介します。
APIとは
APIとはプログラムの機能の一部を別のプログラム上で利用できるように共有する仕組みです。
アプリAを使ってアプリBにデータを反映するリクエスト、
アプリAのデータをアプリBに反映するレスポンスの2通りがあります。
これによってCSVやエクセル形式に変換してダウンロード、データをコピペして書式を整えて…etc
といった面倒な作業を自動でできる仕組みが作れるようになります。
APIに関してとてもわかりやすい解説がありましたのでリンクを載せておきます。
ZAICOとは?
会社で使っている原料管理アプリです。
クラウド・アプリどちらでも使用可能です。
無料で30日間使えたので試してみたところ、社内でとても好評だったため導入しました。
前職の大手メーカーで働いていたときは、外部通信とかってセキュリティ大丈夫?とか
それやる意味あんの?と後ろ向きな意見のほうが多く、
嫌味も言われてクソ野郎がと思ったり…
ベンチャーはフットワーク軽めなので色々試させてもらえてありがたいです。
(もちろんやることに対しては責任を持って取り組んでます!)
話が脱線してしまいましたが
ZAICOもAPI連携が可能です。
ただしこちらを利用するためには月額3,000円 /人のスタンダードプランに入る必要があります。
API機能の認証にはトークン認証が用いられています。
詳細は公式HPにも記載されています。
▼ZAICO APIを使って在庫データを操作する|サポートページより
この機能を使ってスプレッドシートにデータを反映していきます。
コード紹介
それではGASの紹介です。
function myFunction(){
// xxxxxxxxxxxxにAPIトークンを設定する
var requestHeaders = {
'Authorization' : 'Bearer xxxxxxxxxxxxxxxxxxxxxxxxxx'
}
// リクエストオプション
var requestOptions = {
"method" : "GET",
"headers" : requestHeaders
}
var requestUrl = "https://web.zaico.co.jp/api/v1/inventories/"
var response = UrlFetchApp.fetch(requestUrl, requestOptions)
var responseCode = response.getResponseCode()
var responseText = response.getContentText()
// JSON変換
var inventories_data = JSON.parse(responseText)
var inventoriesArray = [];
for(i=0; i<inventories_data.length; i++){
inventoriesArray[i]=[
inventories_data[i]["id"],
inventories_data[i]["title"],
inventories_data[i]["quantity"],
inventories_data[i]["unit"]
]
}
//スプレッドシートへデータを入力する
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
sheet.getRange(2,1,inventoriesArray.length, inventoriesArray[0].length).setValues(inventoriesArray);
}
今回はスプレッドシートの公開はできません。
会社のZAICOアカウントをさらしてしまうので…。
ご了承ください。
スプレッドシートのGASは1日1回更新するようにタイマーを設定しています。
ポイント解説
ポイントを解説していきます。
通信方法はAPIトークン認証
// xxxxxxxxxxxxにAPIトークンを設定する
var requestHeaders = {
'Authorization' : 'Bearer xxxxxxxxxxxxxxxxxxxxxxxxxx'
}
// リクエストオプション
var requestOptions = {
"method" : "GET",
"headers" : requestHeaders
}
var requestUrl = "https://web.zaico.co.jp/api/v1/inventories/"
var response = UrlFetchApp.fetch(requestUrl, requestOptions)
var responseCode = response.getResponseCode()
var responseText = response.getContentText()
最初に書いたようにZAICOはAPIトークンを使用しているため、APIトークンを組み合わせて認証ヘッダーを生成する必要があります。
JSON.parseメソッドでJSONデータを解析
// JSON変換
var inventories_data = JSON.parse(responseText)
var inventoriesArray = [];
for(i=0; i<inventories_data.length; i++){
inventoriesArray[i]=[
inventories_data[i]["id"],
inventories_data[i]["title"],
inventories_data[i]["quantity"],
inventories_data[i]["unit"]
]
}
JSONとは「JavaScript Object Notation」の略称で、Javascriptでのデータオブジェクトの記述方法をベースにしたデータ形式です。
APIでデータをやり取りする際の形式として、JSONというデータフォーマットを使うケースが多いです。
そのAPIでデータをやり取りする際の形式として、JSONというデータフォーマットを使うケースが多いです。
GASはJSON形式で書かれた文字列を解析出来ないので、JSON.parseメソッドでJSONオブジェクトに変換する必要があります。
詳しいことは以下のサイトに記載されていました。
スプレッドシートへの書き出し
最後はスプレッドシートへの書き出しです。
データ数が増えても良いようにlengthを使用してデータの行列数を取得しています。
//スプレッドシートへデータを入力する
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
sheet.getRange(2,1,inventoriesArray.length, inventoriesArray[0].length).setValues(inventoriesArray);
出来なかったこと|追加項目の出力
今回のGASで出来なかったことがあります。
追加項目の出力です。
ZAICOの単価項目は手動で追加入力します。
データを抜き取った直後のログには「単価」があるのですが
この追加項目をJSON変換するとなくなってしまいます。
なかなかスマートには行きませんでした。
無念…。
2次元配列にするためにforループなどにする必要がりそうですが、そもそも出力できていない。
こちらは分かり次第次の記事にしたいと思います。
まとめ
今回は実装したGoogle Apps Script(以降GAS)を使ってWeb APIを取得し、スプレッドシートに反映するコードを紹介しました。
スプレッドシートに反映する記事で自分に該当するものがなかったので読み解くのに苦労しましたが勉強になりました。
ただ追加項目の出力ができなかったのが残念です。
また調べて分かり次第記事にできればと思います。
【小言】
今まで朝ヨーグルトばかり食べていましたが、乳糖不耐症と発覚…
納豆ご飯に切り替えたら快便になりました💩
以上、ごすけでした!!