2023年3月5日日曜日

GAS を使って「青果物市況情報」及び「青果物卸売市場調査(日別調査)」の CSV ファイルを毎日自動取得する

農林水産省が公開している「青果物市況情報」及び「青果物卸売市場調査(日別調査)」の 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); // 保存
  }
}

3行目「市場コード」、4行目「種別」、26行目「フォルダ ID」を書き換えてください。

市場コード及び種別は「青果物市況情報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版]
詳解! Google Apps Script完全入門 [第3版]

by SimpleImageLink


***

これで、都度ポチポチやってファイルを取得する手間を省けます。無駄な手間はコツコツ省いていきましょう。

一つひとつはわずか数分、数秒だとしても、塵も積もれば山となります。

生み出した真水のような時間は、何にでも自由に使うことができます。


きな粉


・関連投稿
青果物市況情報を JSON 形式で取得する Web API を作りました。(更新:CSV 形式での取得も可能になりました)

青果物卸売市場調査(日別調査)を JSON 形式で取得する Web API を作りました。(更新:CSV 形式での取得も可能になりました)


Twitter (@nkkmd) 日々更新中です。