GAS에서 자동 알림 도구를 개발할 때의 메모

GAS를 사용하여 GoogleSpreadSheet, Gmail, Chatwork를 함께 사용하는 자동 알림 도구를 만들 때 비망록입니다.
일순간, IFTTT로 어떻게든 상당히 생각하고 있었습니다만, 스크래핑적인 일을 할 필요가 있었으므로 GAS를 끼웠습니다.
(GAS의 트리거가 cron적인 일을 해 주어 최고!

처리 개요


  • 일정 시간마다 Gmail에서받은 메일의 내용을 분석하고 GoogleSpreadSheet에 설명 된 Chatwork 계정 및 room_id를보고 알림을 보내고 작업 추가

  • 메모



    스크립트 잠금



    스크립트를 잠그고 다중 실행을 방지합니다.


    var lock = LockService.getScriptLock();
    

    스크립트의 잠금 상태를 확인하고 후속 처리를 수행합니다.


  • 잠긴 경우 지정된 밀리초 후 시간 초과
  • if (lock.tryLock(1000)) // 引数はタイムアウトするまでの秒数
    {
        // 処理を実行
        exec();
    
        // ロック解除
        lock.releaseLock();
    }
    else
    {
        // ポップアップを表示
        Browser.msgBox("現在、別の処理が実行中の為、実行できませんでした。\\n\\n時間をおいて、再度実行して下さい。");
    }
    

    Gmail 협력



    Gmail을 지정한 검색 문자열로 검색하여 스레드 검색


    // 検索文字列
    var search_string = "is:unread ";
    
    var threads = GmailApp.search(search_string, 0, 500);
    
  • 검색 문자열은 Gmail 화면 상단의 검색 상자에서 만들 수 있습니다

  • thread의 내용을 확인, 독해 처리를 실행한다


    for (var i = 0; i < threads.length; i++)
    {
        var msgs = GmailApp.getMessagesForThread(threads[i]);
    
        for (var j = 0; j < msgs.length; j++)
        {
            var tmpBody = msgs[j].getBody();
            Logger.log(tmpBody);
    
            // スクレイピング的に文字列を取得、使用する処理
            hoge(tmpBody);
        }
    
        // 既読にする
        threads[i].markRead();
    }
    

    범용



    시간 취득


  • 시간 얻기
  • 시간대 : Asia/Tokyo
  • 포맷 : yyyy/M/d

  • var endDate = Utilities.formatDate(sheet.getRange('A1').getValue(), 'Asia/Tokyo', 'yyyy/M/d');
    

    지정된 범위의 최종 입력 행을 가져옵니다.


    var lastRowNumRangeAA = sheet.getRange('A:A').getValues().filter(String).length;
    

    지정된 범위의 값을 취득해 배열화


    var values = sheet.getRange('A1:A1000').getValues();
    values = Array.prototype.concat.apply([],values);
    

    채팅 워크 API 실행



    태스크화


    var CHATWORK_API_TOKEN = "hogehoge";
    
    // 期限は現在日時
    var limit = Math.floor( (new Date()).getTime() / 1000 ) ;
    // 期限タイプ(none, date, time)
    var limit_type = "time";
    
    var method = "post";
    var room_id = 11111111;
    var body = encodeURI("メールを確認して下さい。\n※期限 : " + endDate + "まで※");
    var to_ids = user_ids;
    var url = "https://api.chatwork.com/v2/rooms/"+room_id+"/tasks?body="+body+"&limit="+limit+"&limit_type="+limit_type+"&to_ids="+to_ids;
    
    execChatworkApi(method, url);
    
    function execChatworkApi(method, url)
    {
      var _url = url;
      var _method = method;
      var params = {
        headers : {"X-ChatWorkToken" : CHATWORK_API_TOKEN},
        method : _method
      };
      var strResponse = UrlFetchApp.fetch(_url, params);
      var json = JSON.parse(strResponse.getContentText());
      return json;
    }
    
  • Chatwork API 테스트의 경우 Talend와 같은 테스트 도구를 사용하여 쉽게 테스트 할 수 있습니다.
  • Talend로 시작하는 REST API 테스트


  • 정기 실행 설정


  • Google 스프레드 시트 > 도구 > 스크립트 편집기 > 현재 객체 트리거 아이콘 클릭 > 트리거 추가



  • GAS 실행 계정 마이그레이션


  • GAS가 실행되는 스프레드 시트의 소유자 권한 변경
  • 위에서 설정한 트리거의 권한을 변경할 수 없습니다 (2020/03/01 현재)
  • 트리거는 계정 단위 설정이됩니다
  • 마이그레이션 전의 설정 내용을 확인하면서 마이그레이션 후의 계정으로 재설정 할 수밖에 없다?


  • 참고


  • Google App Script 공식 문서
  • Chatwork API 문서

  • 다음


  • 최근 GAS에서 V8 런타임을 사용할 수 있게 되었기 때문에 다음에 GAS를 사용하는 것이 있다면 let 라든지 const를 사용하고 싶다 (var는 사용하고 싶지 않다. )
  • V8 Runtime Overview - Google Apps Script

  • 좋은 웹페이지 즐겨찾기