Googleスプレッドシートでマクロ実行する方法

Excel は VBA を用いてマクロを実行できますが,Google スプレッドシートは Google Apps Script (GAS) で処理を自動化できます.

今回は楽天ブックス書籍検索 API を用いて書籍タイトルの一部から ISBN,著者,定価を取得して入力を補完するシートを作ってみました.

実行イメージ

gas-script.gif

上記イメージはスクリプトを設定して「実行」を押したときの処理結果です.

書籍名は一部しか入力していませんが,API があいまい検索に対応しているため入力の手間を省けます.

楽天ブックス書籍検索API

今回は楽天ウェブサービスで提供している API を使用します.Amazon と Google も書籍の API を提供していますが,情報の充実度等を考えて楽天を選択しました.

使用するにはアプリ ID の発行が必要ですが,書籍情報を検索して取得するだけなら OAuth 認証は要らないため気軽に使えます.

Google Apps Script

Google Apps Script は JavaScript ベースで開発されています.一部新しい機能は利用できないそうですが,編集画面でフォーマットや自動補完もできるため普通に便利です.

スプレッドシートの ツール タブで スクリプトエディタ を押すと,Apps Script の実装画面になります.

実装概要

シート名を指定してシートを取得,getRange() でセルを指定し,ゲッター / セッターで値を取得,挿入します.

API は UrlFetchApp.fetch() で GET / POST が実行でき,引数でクエリパラメータを与えます.

短時間に連続して API を呼び出すと停止してしまうため,入力していない内容についてのみ情報を更新するのが良さそうです.

検索条件に合致する書籍が複数あっても最初の要素を取得しますが,検索条件はスペース区切りで指定できるようでセルにスペース区切りで入力して実行すれば絞り込めるので無視できるものとしています.

実行イメージでは図形を挿入して「実行」ボタンとしています.図形を選択すると表示される3点リーダのオプションボタンで「スクリプトを割り当て」をクリックし,関数名を入力すればボタンになります.

実装詳細

function getInformation() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');

  const rakutenURL = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404';
  const applicationId = 'APPLICATION ID (number)';

  for (var i = 2; i <= sheet.getLastRow(); i++) {
    const titleCell = sheet.getRange(i, 1);
    const isbnCell = sheet.getRange(i, 2);
    const authorCell = sheet.getRange(i, 3);
    const priceCell = sheet.getRange(i, 4);

    if (isbnCell.isBlank()) {
      const payload = {
        applicationId,
        title: titleCell.getValue()
      };
      var options = {
        'contentType': 'application/json',
        'payload': JSON.stringify(payload)
      };
      
      const json = UrlFetchApp.fetch(rakutenURL, options);
      const data = JSON.parse(json).Items[0].Item;
      Logger.log(data);

      titleCell.setValue(data.title);
      isbnCell.setValue(data.isbn);
      authorCell.setValue(data.author);
      priceCell.setValue(data.itemPrice);
    }
  }
}

最後に

JS が書けるなら簡単に実装できるので使い勝手が良さそうです.

(追記 2021.6.9)

スマホでは Apps Script を実行できないため,少し工夫が必要になります.

上記では関数名を getInformation() としていますが,例えば onEdit() とすると編集画面を開いた瞬間に実行できます(実行時間30秒制限あり).

参考

楽天ブックス書籍検索API (version:2017-04-04)