IT Hands-on Lab

小規模組織向けIT環境の構築・運用に役立つ情報を、ハンズオン形式で紹介しています。

【Google Apps Script】e-Stat API データ取得

【Google Apps Script】e-Stat API データ取得

Google Apps ScriptでAPI呼出しによるデータ検索を実施し、Googleスプレッドシートに反映する例を紹介します。APIはe-Stat(日本の統計を閲覧できる政府統計ポータルサイト)が提供している開発者向けAPIを使用します。
  • 操作環境:
    • OS:Windows 11
    • Webブラウザー:Google Chrome
  • 使用プラン:Google Workspace Business Starter(個人プランも可)

 

 

使用APIについて

以前の記事でExcel VBAによるe-Stat APIを使用したデータ取得(CSV形式)を行いました。
今回はこれとほぼ同じ処理をGoogle Apps ScriptとGoogleスプレッドシートで実装してみます。
e-Stat APIの使用開始手順(appId取得を含む)は以前の記事の工程1、API実行用URL取得手順は以前の記事の工程2、PostmanによるAPI動作確認の紹介は以前の記事の工程3をご参照ください。
以降、この記事ではGoogle App ScriptをGASと表記します。

 

検索結果反映用Googleスプレッドシート用意

この例では、検索結果出力用のGoogleスプレッドシートをGoogleドライブのマイドライブに用意します([新規>Googleスプレッドシート>空白のスプレッドシート]から新規作成できます)。

図表2-1 Google Drive画面

図表2-1 Google Drive画面

 

ファイルを開き、出力先シートとして[eStat_Search_Output]シートを用意します。各セルは値なしで問題ありません。

図表2-2 Googleスプレッドシート 出力先シート

図表2-2 Googleスプレッドシート 出力先シート

 

出力元シートとして[eStat_Search_Input]シートを用意します。
B1セルをAPI実行用URL欄(取得方法は以前の記事の図表2-10参照)とします。

図表2-3 Googleスプレッドシート 出力元シート

図表2-3 Googleスプレッドシート 出力元シート

 

検索実行ボタンは図形を挿入して工程3のスクリプトを割り当てる形で用意します。

 

上メニューの[挿入>図形描画]を選択します。
[図形描画]画面が表示されたら、図形アイコンを選択し、[図形]からボタンに見立てた図形を選択します。

図表2-4 Googleスプレッドシート 実行ボタン作成

図表2-4 Googleスプレッドシート 実行ボタン作成

 

挿入した図形にテキストを追加するには、図形を右クリックして[テキストを編集する]を選択します。
「検索実行」と入力します。
[図形描画]画面右上の[保存して閉じる]を選択します。

図表2-5 Googleスプレッドシート 実行ボタン作成の続き

図表2-5 Googleスプレッドシート 実行ボタン作成の続き

 

スプレッドシート内に挿入されたボタンを選択し、三点マークが表示されたらこれを選択し、[スクリプトを割り当て]を選択します。
工程3で作成するスクリプトの関数名を指定し、[確定]を選択します。

図表2-6 Googleスプレッドシート スクリプト割り当て

図表2-6 Googleスプレッドシート スクリプト割り当て

 

検索結果反映用Google Apps Script用意

上メニューの[拡張機能>Apps Script]を選択します。

図表3-1 GASとの紐づけ

図表3-1 GASとの紐づけ

 

画面右側のスクリプトエディターにスクリプトを記述していきます(スクリプトの内容は工程4で紹介します)。
上メニューのプルダウンから実行したいスクリプトを選択し、[実行]を選択すると、動作確認できます。行番号の左側を選択すると、ブレークポイントを設定でき、デバッグもできます。

図表3-2 GASコードエディター

図表3-2 GASコードエディター

 

APIキーのような、スクリプトやGoogleスプレッドシート内に埋め込みたくないセキュアな値は、スクリプトプロパティに設定します。
左端の歯車アイコン(プロジェクトの設定)を選択し、画面の下の方にある[スクリプト プロパティを追加]を選択します。
e-Stat APIのappId(取得方法は以前の記事の工程1参照)を定義し、[スクリプトプロパティを保存]を選択します。

図表3-3 GASスクリプトプロパティ

図表3-3 GASスクリプトプロパティ

 

Google Apps Scriptによるデータ取得・加工実装

スクリプトの基本的な設計は以前紹介したExcel VBA版とほぼ同じですので、そちらも参考にしてください。異なる点を以下に示します。

  • appIdは、Googleスプレッドシート上ではなく、図表3-3で定義したスクリプトプロパティから取得している(15行目)
  • Googleスプレッドシート上ではテキストボックスを使用できないため、B1セルに入力されたURLを取得する設計とした(18-19行目)
  • API実行の記述はシンプルなため、サブ関数を作成せず、メイン関数内で実行している(29-33行目)
  • Googleスプレッドシート上ではダイアログボックスを使用できないため、トースト通知を表示する設計とした(38-39,47,50行目)
/**
 * 【メイン】eStatAPIのデータ検索結果をスプレッドシートに出力する
 */
function geteStatAPI() {

  let ss = SpreadsheetApp.getActiveSpreadsheet();

  try {

    // 出力先ワークシートの設定 、データ初期化
    const ws = ss.getSheetByName("eStat_Search_Output");
    ws.clear();

    // appIdの取得
    const appId = PropertiesService.getScriptProperties().getProperty("appId");

    // URLの取得(appId=で分割)
    const arrayUrl = ss.getSheetByName("eStat_Search_Input").
      getRange("B1").getValue().split("appId=");

    // データ検索
    const apiMethod = "GET";
    const apiUrl = arrayUrl[0] + "appId=" + appId + arrayUrl[1];
    const apiHeaders = {
      "Content-Type": "application/json",
    };

    // データ取得の実施
    const response = UrlFetchApp.fetch(apiUrl, {
      method: apiMethod,
      headers: apiHeaders,
    });
    const apiResponse = response.getContentText();
    const data_row = apiResponse.split("\n");//LF改行は\n

    // データ検索でエラーが発生した場合、ダイアログを表示する
    if (data_row.length < 6) {
      ss.toast("統計データの取得でエラーが発生しました。:" + 
        data_row[1] + "," + data_row[2], "データ取得エラー", -1);
      return;
    }

    // 取得したデータのシート書き出し
    writeSearchData(ws, data_row);

    //出力完了
    ss.toast("統計データの出力が正常終了しました。:", "正常終了", 3);

  } catch (error) {
    ss.toast("統計データの出力が異常終了しました。:" + error.message, "異常終了", -1);
  }
}

/**
 * 【サブ】eStatAPIのデータ検索結果をスプレッドシートに出力する
 * @param {SpreadseetApp.Sheet} ws 出力先ワークシート
 * @param {Object[]} data_row データ検索結果の配列
 */
function writeSearchData(ws, data_row) {

  let data_col = []; //data_rowを,で分割格納した変数
  let start_row = 0; //タイトル行の行番号(行が"tab_code"で始まる)
  let value_col = 0; //value列の列番号(タイトルが"value")

  for (let cnt_row = 0; cnt_row < data_row.length; cnt_row++) {
    //タイトル行
    if (data_row[cnt_row].includes('"tab_code"')) {
      start_row = cnt_row; //"tab_code"で始まる行はタイトル行であり行番号を格納
    }
    if (cnt_row >= start_row) { //タイトル行以降を書き出し対象とする
      data_col = data_row[cnt_row].split(',');
      for (let cnt_col = 0; cnt_col < data_col.length; cnt_col++) {
        if (cnt_row == start_row && data_col[cnt_col] == '"value"') {
          value_col = cnt_col; //タイトル行かつvalue列の場合、列番号を格納
        }
        if (cnt_row > start_row && cnt_col == value_col) { //データ行かつvalue列の場合
          if (data_col[cnt_col] != '"-"') { //値が"-"でない場合、"を除き出力
            ws.getRange(cnt_row - start_row + 1, cnt_col + 1).
              setValue(data_col[cnt_col].replaceAll('"', ''));
          }
        } else {//データ行でないかvalue列でない場合、先頭に'を付加し、"を除き出力
          ws.getRange(cnt_row - start_row + 1, cnt_col + 1).
            setValue("'" + data_col[cnt_col].replaceAll('"', ''));
        }
      }//end for cnt_col
    }
  }//end for cnt_row
}

 

動作確認

[eStat_Search_Input]シートのB1セルにAPI実行用URL (取得方法は以前の記事の図表2-10)を入力し、[検索実行]ボタンを選択します。
右下の処理終了のトースト通知が表示されるのを待ちます。

図表5-1 動作確認(出力元シート)

図表5-1 動作確認(出力元シート)

 

[eStat_Search_Output]シートを開いて結果を確認します。

図表5-2 動作確認(出力先シート)

図表5-2 動作確認(出力先シート)

 

おわりに

スクリプトプロパティを使用したため、Google Books APIsのデータ検索(前の記事)よりわずかに複雑になりましたが、それでもとても簡単に実装できます。
また、 Excel Online × Office Scriptの場合と違い、GASはサーバーサイドで実行されるため、API実行時にfetchエラーも発生しません
JavaScriptを少し知っていれば、簡単に実装できるかと思います。

 

 

当ブログ内の関連記事

elmgrn.hatenablog.com