蔵書管理2

May 1, 2018
google spreadsheet データ入力 Forme Pro Forme lite Mac 国会図書館api 蔵書管理

グーグルドライブとformeで蔵書管理

前回”エクセルとformeで蔵書管理”は、インターネットから書籍名を参照する段階が問題になりました。 そこで今回はオンラインサービスであるグーグルドライブでその問題点を解決しようと思います。 念のために目標とした機能を振り返りましょう。

目標とする機能

機能はformeでISBN番号を読み取り、本の評価を入力し、そのデータをエクセルで読み込んだ後に、ISBN番号を元に書籍情報を インターネットから取得する。

今回はformeの共有データをグーグルドライブの指定されたフォルダにアップロードすると、それを読み込みアーカイブに追加する。 というものにします。

手順

forme設定変更編

formeは日本語環境では文字コードが自動的に”Shift-jis”に設定されています。設定から文字コードを”UTF-8”に変更して下さい。 グーグルドライブ側で対策する事も可能ですが、今回はforme側で対応します。

グーグルドライブ編

1.準備する。 グーグルドライブにログインし、”蔵書管理”フォルダと”csv”フォルダを作成します。更に”蔵書管理”フォルダ内に”backup”フォルダを作成します。


root
 |
 |_蔵書管理
 |   |
 |   |_backup
 |   |
 |   |_蔵書管理スプレッドシート
 |
 |_csv
 

“蔵書管理”フォルダ内に”蔵書管理”スプレッドシートを作成します。以下のような表(ヘッダー)を作成します。

A B C D
日時 ISBN 書籍名 状態

2.コード表示する。スプレッドシートの”ツール”タブ > “スクリプトエディタ”を選択します。

3.名前を変更する。”無題のプロジェクト”を選択し、プロジェクト名を”蔵書管理”に変更します。

今回、書籍名の取得はgoogle books apiではなく国会図書館apiのopensearchを利用します。

なぜ変更したかと言うと、日本国内で出版されたものであれば間違いなく登録されている点と google apps script上でgoogle books apiを使用する為の情報が少なかった為です。 尚、国会図書館apiは基本的には登録は必要ありませんが、商用利用と頻繁にアクセスする場合は登録する必要があります。

国会図書館apiとgoogle apps scriptについては以下のサイトを参考にしました。

国立国会図書館のAPIをGoogle Apps Scriptで読み込む

4.書籍名検索関数を作成する。スクリプトエディタ上で、ISBNから書籍名を取得する関数を作成します。 ここではswitch文で取得する情報を変えています。

初めてスクリプトを起動する際にグーグルから警告がでます。 自身の作成したスクリプトである事を確認して許可を与えて下さい。


function searchIsbnN(isbn,sw) {
  var url = "http://iss.ndl.go.jp/api/opensearch?isbn=" + isbn;
  
  var iba = UrlFetchApp.fetch(url);
  
  var value;
  
  try{
    var documentXml = XmlService.parse(iba.getContentText());
    var items = documentXml.getRootElement().getChildren('channel')[0].getChildren('item');
    var namespaceDc = XmlService.getNamespace("dc", "http://purl.org/dc/elements/1.1/");
    var namespaceDcndl = XmlService.getNamespace("dcndl", "http://ndl.go.jp/dcndl/terms/");
  
    switch(sw){
      case 0: value = items[0].getChildText("title", namespaceDc);break;
      case 1: value = items[0].getChildText("creator", namespaceDc);break;
      case 2: value = items[0].getChildText("pubDate");break;
      case 3: value = items[0].getChildText("edition", namespaceDcndl);break;
      default: value = "sw is 0 ~ 3";
  }
  }catch(e){
    value = "ERROR";
  }
    
  return value;
}

5.再読み込み防止を作成する。読み込んだ後のcsvデータを”backup”フォルダに移動するスクリプトを作成します。


function moveCsv(){
  var beforedir = DriveApp.getFolderById('csvフォルダのIDを入力');
  var afterdir = DriveApp.getFolderById('backupフォルダのIDを入力');
  var movedata = beforedir.getFiles();
  while(movedata.hasNext()){
    var data = movedata.next();
    afterdir.addFile(data);
    beforedir.removeFile(data);
  }
}

6.アーカイブに追加する。csvフォルダにcsvデータ”書籍管理.csv”が存在していると”書籍管理”スプレッドシートの一番目のシートに書き込みを行います。


function importCsv(){
  
  var sid = SpreadsheetApp.openById('書籍管理スプレッドシートのID');
  var sheets = sid.getSheets();
  var recSheet = sid.setActiveSheet(sheets[0]);
  var date = new Date();
 
  var readfile = "書籍管理.csv";
  var dir = DriveApp.getFolderById('csvフォルダのIDを入力');
  var files = dir.getFiles();

  while(files.hasNext()){
    var thisdata = files.next();
    if(thisdata.getName() == readfile){
      try{
        var data = thisdata.getBlob().getDataAsString();
        var csv = Utilities.parseCsv(data);
    
        for (var i = 0; i < csv.length - 1; i++){
          recSheet.appendRow([
            date,
            csv[i][0],
            searchIsbnN(csv[i][0],0),
            csv[i][1]
      ])
    } 
  }catch(e){
    
  }
  moveCsv();
    }
  }
}

実施結果

7.ISBN検索機能を付ける。formeには”QRメモ”機能が付いています。 この機能で作成したtxtデータを元にアーカイブ内を検索し、結果をメールで返信する機能を追加します。


function searchIsbn(isbn){
  var sid = SpreadsheetApp.openById('csvフォルダのIDを入力');
  var sheets = sid.getSheets();
  var sheet = sid.setActiveSheet(sheets[0]);
  var dat = sheet.getDataRange().getValues();
   for(var i=1;i<dat.length;i++){
    if(dat[i][1] == isbn){
      return i+1;
    }
  }
  return 0;
}

function isbnService(upf){
  var message = "ERROR";
  try{
    var isbn = upf.getBlob().getDataAsString();
    isbn = isbn.trim();
    var sw = searchIsbn(isbn);
    if(sw == 0){
      message = "該当番号なし : " + isbn;
    }else{
      message = "該当番号あり(要確認) : " + isbn + "\n 後で設定するグーグルサイトのアドレス";
    }
  }catch(e){
    
  }
  MailApp.sendEmail('あなたのメールアドレス@***.com','蔵書管理ISBN検索結果',message);
  moveCsv();
}

検索結果

8.トリガーを設定する。自動的にスクリプトを起動するトリガーを設定します。 ただし、このままだとimportCsv()とisbnService()それぞれに設定しなければならないので 起動するスクリプトを判断する機能を追加します。


function uploadCheck(){
  var upfolder = DriveApp.getFolderById('csvフォルダのIDを入力');
  var ups = upfolder.getFiles();
  if(ups.hasNext()){
    var upf = ups.next();
    if(upf.getName() == "書籍管理.csv"){
      importCsv();
    }else{
      isbnService(upf);
    }
  }
}

このスクリプトに10分毎に起動するトリガーを設定します。

完成

完成したスプレッドシートを外出先でも閲覧できるようにグーグルサイトでサイトを作成します。

尚、グーグルにログインしていないと以下のようになります。

csvデータをアップロードしたとしても反映されない場合があるので最終的なメンテナンスは必要ですが、 目標とした機能を作成することができました。スクリプトの高速化をしていない為、スクリプト実行後6分経過すると強制終了します。

今ではすべての蔵書を登録し、グーグルフォームのトリガーでデータをアップロード後にすぐスクリプトを起動できるようにしました。 スプレッドシートにも機能を追加して見やすい表となり、個人的に運用するには十分満足しています。

グーグルフォームでも似たような機能を作成する事は可能ですが手元でバーコードを読み取り、 個人的な評価を設定するという作業はformeのほうが圧倒的に早いです。

formeは本来、オフラインのPCとの連続データ入力効率化の為に開発しましたがオンラインでも案外使えそうです。

実際フォーム作成の手間はほとんどないと言えますし、 共有データと未共有データを内部で区別しているので自動的に未共有データだけを共有することができます。

Next Previous

FormeStudio26.6の機能説明

November 16, 2023
excel Excel for Mac Mac 操作 ForMe FormeStudio

チェックシート機能について

April 17, 2023
ForMe データ入力 操作 チェックシート

FormeCollector2からFormeStudioへ

April 17, 2023
excel データ入力 ForMe FormeStudio