무료로 읽고 싶다! 도서관 API에서 신서가 도서관에 등록된 타이밍에 LINE 통지한다(그 2)

배경



지난번 계속.

지난번은 도서관 API에 대한 기사를 작성했으므로 이번에는 Google 스프레드 시트의 Google Action Script (=GAS)에 대한 기사를 작성합니다.

어떻게 실현합니까? (이전 기사에서 발췌)


  • Google Spreadsheet에 확인할 신서 제목 (ISBN) 목록을 등록합니다
  • Google 스프레드 시트에 Google Action Script (= GAS)를 등록하고 칼릴 도서관 API를 정기적으로 호출합니다.
  • 신서가 등록되면 LINE에 통지한다

  • Google Spreadsheet 정보



    완성 이미지





    컬럼은 3개만의 심플한 구성으로 했습니다.
  • checking
    정기 점검 대상으로 할지 여부의 플래그로한다. (예약 후 LINE 통지가 필요하지 않으므로)
  • isbn
    도서관 API의 검색 키가 된다.
  • title
    ISBN뿐이라면 서적 제목을 모르기 때문에 추가. LINE 통지시에도 사용한다.

  • GAS 소스 코드



    Google Spreadsheet 메뉴에서 도구 → 스크립트 편집기에서 편집기를 열고 코드를 작성합니다.CALIL_APP_KEYLINE_API_TOKEN는 스크립트 편집기 메뉴에서 파일> 프로젝트 속성을 열고 여기에 값을 저장합니다.



    GAS 소스
    function getBookStatus(isbn, title, appkey, systemid) {  
      var res_finish = false;
      var no_registed = false;
      var res_json = '';
      while (true) {
        res_json = callCalilApi(appkey, isbn, systemid);  
        if ( isFinish(res_json) ) {
          Utilities.sleep(1000);
          break;
        }
      }
    
      //var rj = JSON.parse(res_json); 
      no_registed = res_json.match(/"libkey": {}/);
      Logger.log('rj = ' + res_json + 'no_registed = ' + no_registed );
    
      if ( no_registed ) {
        Logger.log('【未登録】ISBN:[' + isbn + ']の[' + title + ']は横浜市の図書館に登録されていません。');
      } else {
        var msg = '【登録済】ISBN:[' + isbn + ']の[' + title + ']は横浜市の図書館に登録されてます。'
        Logger.log(msg);
        notifyLine(msg)
      }
    }
    
    function isFinish(res_json){
      return res_json.match(/"continue": 0/);
    }
    
    function callCalilApi(appkey, isbn, systemid) {
      var response = UrlFetchApp.fetch('http://api.calil.jp/check?appkey=' + appkey + '&isbn=' + isbn + '&systemid=' + systemid + '&format=json');
      // XMLだとDTDが必要なのでやめた。(カーリルにDTDがない)
      // でも、コールバック処理の扱いがGASではわからない  
      // むりやり文字列でcontinueを判定w
      res_json = response.toString().slice(9,-2);
      Logger.log(res_json);
    
      return res_json ;
    }
    
    
    function notifyLine(message) {
      var TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_API_TOKEN");
      var res = null;
      var options = {
        "method": "post",
        "payload": "message=" + message,
        "headers": {"Authorization" : "Bearer "+ TOKEN}
       };
      res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
      return res;
    }
    
    function main() {
      // スプレッドシートから読み込む
      // アクティブなシートを取得
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getActiveSheet();
      //getRangeで範囲を指定し、getValuesで値を取得
      var checkbooks = sh.getRange('A4:C100').getValues();
    
      // 固定
      var appkey = PropertiesService.getScriptProperties().getProperty("CALIL_APP_KEY");
      var systemid = 'Kanagawa_Yokohama'
    
      for(var i=0; i<checkbooks.length; i++) {
        var idx_check = 0
        var idx_isbn  = 1
        var idx_title = 2
    
        if( checkbooks[i][idx_check] === "チェックしない" || checkbooks[i][idx_isbn] === "" ){
          continue ;
        }
    
        getBookStatus(checkbooks[i][idx_isbn], checkbooks[i][idx_title], appkey, systemid);
      }
    }
    

    요약



    이 도구를 사용하여 "입문 모니터링 (ISBN : 4873118646)"을 두 번째로 예약 할 수있었습니다.
    오전 2시 19 분에 첫 번째 LINE 알림이 왔고 10시 19 분에 LINE 알림을 받고 즉시 예약했지만 8 시간 동안 예약 한 사람이 있음에 놀랐습니다.
    (1번에 예약하기 위해서는 자동 예약의 구조가 필요하네요)

    마지막으로,
    GAS의 js 소스 코드가 꽤 어색하고 죄송합니다. 최근 js 소스에 쓰지 않았기 때문에 우선 움직이는 것이 최우선으로 에이야에서 썼습니다.
    callback 처리를 알지 못했기 때문에 상당히 적절한 소스 코드이지만 목적을 달성했기 때문에 좋다고 생각합니다.

    참고 페이지


  • 카릴 도서관 API
    htps : // / ぃ l. jp/do c/ap. HTML
  • 좋은 웹페이지 즐겨찾기