西町北21丁目/a>

西町北21丁目

まともな事を書きます

googleスプレッドシートとgoogleフォームで読書を記録する

 3ヶ月ほど前、googleスプレッドシートで蔵書管理を半自動化したことを書きました。 ni4mc.hatenablog.com  蔵書を管理できるようになったは良いものの、他のオタクは読書をアプリで記録しているらしいです。偉いですね。読んだ本を記録するのはなかなか楽しそうなので、読書記録もgasでサクッと作ることにしました。

そうしてできたのがこちら。素人の俺でも30分ぐらいで完成したのでチョロいもんです。

 しかし、googleスプレッドシートはモバイルアプリからのアクセスだとボタンが機能しないそうで、スマホからアクセスすると全く機能してくれません。なんてこった。 本を読み終えるたびにパソコンを立ち上げるのは面倒なので、ボタンで登録する方式を諦めてgoogleフォームを用いて登録する方式に方向転換します。

とりあえず結果から見せていくと、こんな感じになりました。

 ということで、ここからはこれを構築する方法について書いていきます。

材料

googleフォーム

googleフォームでISBNコードの入力を受け付けるフォームを作ります。自分は文庫だとかコミックだとかの分類をするため、ジャンル分けコードの入力欄も付けています。 ということで、自分の環境だとこんな感じになりました。

スプレッドシート

読書管理用のスプレッドシートを作成するか、既存のスプレッドシートへ新しいシートを追加します。スプレッドシートを新規で作成する場合、後述するフォームの出力先を設定する段階で作るのもアリです 。

googleフォームの準備

 googleフォームが受け付けた回答をスプシへ出力するように設定します。フォームの編集画面より、「回答」タブを開き、「回答先を選択」より、出力したいスプシを選択します。このときに、新規のスプシを立ち上げることもできるのでそれでも良いです。 そうすると、スプシの中にフォームからの入力データが入るシートが作成されたと思います。このデータを参照して書籍情報を読書記録のシートへ記録します。

コードを書く

 スプシの「拡張機能」→「Apps Script」からスクリプトエディタを立ち上げて、スクリプトを書いていきます。

function readlog(){
  const sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("読書記録");
  const lastrow=sheet.getLastRow();
  var targetCell = "A1"
  var range= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("読書記録").getRange(targetCell);

  const sheetform=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォーム入力");
  const lastrowform=sheetform.getLastRow();
  var targetCellform = "A1"
  var rangeform= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォーム入力").getRange(targetCell);

//最終行(つまり最新)のデータをフォームの入力から取得
  var isbn = rangeform.offset(lastrow-1,1).getValue();
  var code = rangeform.offset(lastrow-1,2).getValue();
  var isbncode = String(isbn);
    //日付を取得
    var date = new Date();
    date = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd");

//APIで書籍情報をリクエスト
    var response = UrlFetchApp.fetch("https://api.openbd.jp/v1/get?isbn=" + isbncode);
//帰ってきた情報をparseする
    var resultJson = JSON.parse(response);
    if(resultJson[0] != null){
//タイトルと著者を取得・それぞれの情報をセルに書き込む
    range.offset(lastrow,0).setValue(resultJson[0].summary.title);
    range.offset(lastrow,1).setValue(resultJson[0].summary.author);
    }
    else{
    range.offset(lastrow,0).setValue(isbn);
    }

    range.offset(lastrow,2).setValue(code);
    range.offset(lastrow,3).setValue(date);
    
}

 スクリプトはこんな感じ。自分はシートの名前をいじっているので、getSheetByNameの後ろを各自の環境に合わせれば多分コピペで動きます。 蔵書管理のやつをベースに作りましたが、あれに比べてかなり単純な処理なのでだいぶ短めに収まりました。 処理の内容としては、フォーム入力シートからISBNと部門を取得→日付を取得→ISBNからAPIを叩いて版元ドットコムの書籍情報を取得→parseする→データを書き込むという内容です。 このスクリプトはOpenBD APIから版元ドットコムのデータを拾うことで動いているんですが、版元ドットコムにデータがない本が意外とあるのでその点には注意が必要です。ここではAPIを叩いてnullが帰ってきたら書名のセルにISBNを入力するようにしてエラーを回避しています。

トリガーを設定する

 スクリプトエディタの左の方にある時計マークをクリックして、トリガーを設定します。 右下の方の「トリガーを追加する」から、実行する関数をreadlog関数、ソースは「スプレッドシートから」、イベントの種類を「フォーム送信時」のトリガーを追加します。これでフォームから新規データが送信されると、readlog関数が走って読書を記録してくれます。これで完成です。 もっと細かい情報が欲しい場合は蔵書管理の時に書いた方法でjsonに入っている色々な情報を書き込むことができます。

 読書記録アプリは星の数ほどありますが、複数端末から情報を容易に確認できたり、記録する情報のさじ加減など、カスタムも自由自在です。みなさんもスプシで読書管理をしてみてはいかがでしょうか。