毎週のCSV更新作業を自動化!neruniでの活用教えます

毎週木曜日の「手作業ループ」からの脱出

みなさん、neruniの「浜松市休日当番医マップ」は活用してくれていますか?

関連記事

当番医は、3日前から公開します。(当番医は、変更になる場合があります) 診療所によって受け付けや診療の時間が異なる場合があります。受診する場合は、まず電話で確認をしましょう。 休日救急当番医は変更になる場合があります。当日、最新情報は、[…]

IMG

neruniでは、静岡県から発行されるオープンデータを活用して、浜松市のさまざまな情報を紹介しています。

休日当番医マップでは、県のオープンデータを、情報が更新される毎週木曜日に手作業で更新していました。
具体的には「県のサイトからCSVをダウンロード → 必要項目を整理 → 地図プラグインにアップロード」という三段階構え。

正直なところ、初めのうちは「まあこれくらいなら…」と思っていました。でも木曜日になるたびに手順を思い出し、ファイル名を確認し、列の順番を揃える作業をしているうちに気づいたんです。「あれ、俺、またこれやってる……」

「これ、スプレッドシート+GASで自動化できるんじゃない?」という発想

手作業の無駄さに気づき始めた私たちは、「なんとかならないか」と考えました。
そこで目をつけたのが Googleスプレッドシート+Apps Script(GAS) です。

最初は「Excelの関数でどうにかなるかな?」とも思ったのですが、

  • 複数CSVの統合
  • カテゴリ列を文字列から数字に変換
  • approved列の自動追加
  • 未登録カテゴリも安全に処理

などを考えると、関数だけでは限界があります。
そこで、GASで自動化することに決定しました。

作った自動化フローのイメージ

作ったスクリプトの大まかな流れは以下の通りです:

  1. CSVをURLから自動取得
  2. 必要な列だけ抽出
  3. カテゴリ列の文字列を、参照用スプレッドシートを使って数字に変換
    • 複数カテゴリも対応(CSV上は「内科・外科」の形式)
    • 参照リストにないカテゴリは文字列のまま残す
  4. approved列を自動追加
  5. Sheet1に書き込み → そのままインポート可能

こうすることで、Excelで手作業していた「列を選ぶ」「カテゴリを置換する」「approved列を追加する」といった作業を スクリプトが全部やってくれる ことになります。

function importCSVWithCategoryNumber() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  sheet.clear(); // 前のデータをクリア

  // CSV読み込み
  var url = "https://opendata.pref.shizuoka.jp/dataset/12196/resource/104166/iryo_kyujitsu.csv";
  var response = UrlFetchApp.fetch(url);
  var csvData = Utilities.parseCsv(response.getContentText("Shift_JIS")); // UTF-8なら引数不要

  // 必要列のインデックス(例: 名称, 所在地1, 診療科目, 電話番号)
  var requiredColumns = ["医療機関名", "所在地1", "診療科目", "電話番号"];
  var header = csvData[0];
  var colIndexes = requiredColumns.map(name => header.indexOf(name));

  // データ抽出
  var newData = csvData.slice(1).map(row => colIndexes.map(i => row[i]));

  // approved列追加
  newData.forEach(row => row.push("1"));

  // 参照用スプレッドシートからカテゴリ変換表を取得
  var refSheet = SpreadsheetApp.openById("参照スプレッドシートID").getSheetByName("CategoryRef");
  var refData = refSheet.getRange(1, 1, refSheet.getLastRow(), 2).getValues();
  var refMap = {};
  refData.forEach(r => refMap[r[0]] = r[1]); // r[0]=文字列, r[1]=数字

  // カテゴリ列(3列目)を数字に置き換え(複数カテゴリ対応・未登録は文字列のまま)
  newData.forEach(row => {
    var catNames = row[2].split("・"); // 「・」で分割
    var converted = catNames.map(name => {
      name = name.trim();
      return refMap[name] !== undefined ? refMap[name] : name; // 数字に置換できなければ文字列のまま
    });
    row[2] = converted.join(","); // 数字と文字列が混ざってもカンマ区切りで結合
  });

  // ヘッダ作成
  var newHeader = colIndexes.map(i => header[i]);
  newHeader.push("approved");
  newData.unshift(newHeader);

  // Sheet1に書き込み
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

実際に動かしてみたら…

さて、スプレッドシート+GASでの自動化フローを作り、いざ実行!…と行きたかったのですが、ここで思わぬ壁がありました。

実は、CSVのURLが固定ではなかったのです。

  • 毎週県のオープンデータページから提供されるファイルのURLが変わる
  • そのため、GASのスクリプト内で指定しているURLを毎週更新しないと、スクリプトは最新のデータを取得できない

JSON形式でのAPI呼び出しも試したのですが、オープンデータ側の設定で外部からの直接アクセスは許可されていないらしく、結果的に Apps ScriptのURL指定部分を毎週手動で更新する 形になってしまいました。

正直、ここで「せっかく自動化したのに手動か…」と少し肩を落としましたが、やってみると案外これでも大きな時間削減になります。
URLをコピペして更新し、スクリプトを実行すると、Excelで手作業していた列整理やカテゴリ変換、approved列の追加まで 数秒で完了。

しかも、参照用スプレッドシートを用意していたおかげで、カテゴリの文字列→数字変換や、未登録カテゴリの文字列保持も自動で処理されます。
手作業では何分もかかっていた作業が、URLを更新して実行ボタンを押すだけで完了するのは、予想以上に感動的でした。

参考にした情報源

Google for Developers

高品質なクラウドベースのソリューションを簡単に開発できます。…

CSVの文字コードや列位置、トリガー設定方法などは、この公式情報を元に確認しました。

自社ツール化の小さな喜び

最初は「手作業でいいや」と思っていたCSV整理も、スプレッドシート+GASで自動化するだけで劇的に変わります。
日常の小さな作業をツール化することで、チームに少し余裕が生まれ、週のはじめのちょっとしたストレスもなくなります。

木曜日の朝のTODOリストを眺めながら「もう手作業で列を並べなくていいんだな…」と静かに思う。
小さな達成感と安心感を胸に、今日もコーヒーをすすりながら、ゆったりと仕事を始めるのでした。