農林水産省が公開している「青果物市況情報」及び「青果物卸売市場調査(日別調査)」の CSV ファイルを取得する GAS (Google Apps Script) を作りました。
元データのサイトは国外からのアクセスが制限されているようで、GAS から直接データの取得をすることができません。
そこで、cultivationdata.net で公開している市況等 Web API からデータを取得します。もちろん無料。トリガー設定により毎日自動で取得することも可能です。
ちなみに、cultivationdata.net の市況等 Web API は先日作り直しまして、レスポンス速度がだいぶ改善しました。
以下、GAS のコードです。まるっとコピペして数カ所書き換えればお使いいただけます。
▼ 青果物市況情報の CSV ファイルを自動取得する GAS
function getMcCsv() { //// cultivationdata.net より CSV ファイルを取得 const mc = "市場コード"; // 市場コード const cat = "種別"; // 種別 const url = "https://api.cultivationdata.net/mcdata?mc=" + mc + "&cat=" + cat + "&type=csv"; // CSVデータの取得 let response = ""; try { response = UrlFetchApp.fetch(url); } catch(e) { return response; } let data = response.getContentText(); // CSV データ let arr = Utilities.parseCsv(data); // 配列化 // 取得ファイルのチェック if(arr[0][0] == "市場のデータが見つかりませんでした。") { // 市場のデータが見つかりませんでした。 return } // 取得した CSV ファイルの日付を取得 let dt = Utilities.formatDate(new Date(arr[1][0]), 'JST', 'yyyyMMdd'); //// ファイルの保存 const folderId = "フォルダ ID"; // 保存先フォルダ ID // 最新の取得済みファイルの日付を取得 const files = DriveApp.getFolderById(folderId).getFiles(); // 既存ファイル一覧 let latest_dt = ""; if(files.hasNext() != false) { let files_dt= []; while(files.hasNext()) { files_dt.push([files.next().getName().replace(mc + "_" + cat + "_", "").replace(".csv", "")]); } files_dt.sort(function(a, b) {return b[0] - a[0]}); latest_dt = files_dt[0][0]; // 最新の日付 } // 未取得ファイルであれば保存 if(dt == latest_dt) { // 取得済みファイル return } else { // 出力先のフォルダとファイル名 const fileName = mc + "_" + cat + "_" + dt + '.csv'; // 出力するファイル名 // ファイルの保存 const charset = "utf-8"; // 文字コード const contentType = 'text/csv'; //コンテンツタイプ const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(data, charset); // Bolb作成 DriveApp.getFolderById(folderId).createFile(blob); // 保存 } }
市場コード及び種別は「青果物市況情報API説明書」を参照してください。
フォルダ ID は Google ドライブ内の CSV ファイルの保存先フォルダの ID になります。当該フォルダを開いた際の URL の末尾部分の英数字になります(https://drive.google.com/drive/folders/ここの部分)。
▼ 青果物卸売市場調査(日別調査)の CSV ファイルを自動取得する GAS
function getWmrCsv() { //// cultivationdata.net より CSV ファイルを取得 const cc = "都市コード"; // 都市コード const cat = "種別"; // 種別 const url = "https://api.cultivationdata.net/wmr?cc=" + cc + "&cat=" + cat + "&type=csv"; // CSVデータの取得 let response = ""; try { response = UrlFetchApp.fetch(url); } catch(e) { return response; } let data = response.getContentText(); // CSV データ let arr = Utilities.parseCsv(data); // 配列化 // 取得ファイルのチェック if(arr[0][0] == "都市のデータが見つかりませんでした。") { // 都市のデータが見つかりませんでした。 return } // 取得した CSV ファイルの日付を取得 let dt = Utilities.formatDate(new Date(arr[1][0]), 'JST', 'yyyyMMdd'); //// ファイルの保存 const folderId = "フォルダ ID"; // 保存先フォルダ ID // 最新の取得済みファイルの日付を取得 const files = DriveApp.getFolderById(folderId).getFiles(); // 既存ファイル一覧 let latest_dt = ""; if(files.hasNext() != false) { let files_dt= []; while(files.hasNext()) { files_dt.push([files.next().getName().replace(cc + "_" + cat + "_", "").replace(".csv", "")]); } files_dt.sort(function(a, b) {return b[0] - a[0]}); latest_dt = files_dt[0][0]; // 最新の日付 } // 未取得ファイルであれば保存 if(dt == latest_dt) { // 取得済みファイル return } else { // 出力先のフォルダとファイル名 const fileName = cc + "_" + cat + "_" + dt + '.csv'; // 出力するファイル名 // ファイルの保存 const charset = "utf-8"; // 文字コード const contentType = 'text/csv'; //コンテンツタイプ const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(data, charset); // Bolb作成 DriveApp.getFolderById(folderId).createFile(blob); // 保存 } }
3行目「都市コード」、4行目「種別」、26行目「フォルダ ID」を書き換えてください。
市場コード及び種別は「青果物卸売市場調査(日別調査)API説明書」を参照してください。
フォルダ ID は Google ドライブ内の CSV ファイルの保存先フォルダの ID になります。当該フォルダを開いた際の URL の末尾部分の英数字になります(https://drive.google.com/drive/folders/ここの部分)。
▼ トリガー設定について
今回作成した GAS は、新しいデータが追加された場合のみ CSV ファイルの取得を行います。休場日で更新がない日には取得しません。そのため、トリガーは毎日に設定してしまって問題ありません(毎重複して取得はしません)。
データの取得先となる市況等 Web API は16時頃に更新されるので、設定時間はそれ以降とします。
詳解! Google Apps Script完全入門 [第3版]
by SimpleImageLink
***
これで、都度ポチポチやってファイルを取得する手間を省けます。無駄な手間はコツコツ省いていきましょう。
一つひとつはわずか数分、数秒だとしても、塵も積もれば山となります。
生み出した真水のような時間は、何にでも自由に使うことができます。
青果物市況情報を JSON 形式で取得する Web API を作りました。(更新:CSV 形式での取得も可能になりました)
青果物卸売市場調査(日別調査)を JSON 形式で取得する Web API を作りました。(更新:CSV 形式での取得も可能になりました)
Twitter (@nkkmd) 日々更新中です。