【Wakatime으로부터 주일로 도착하는 메일을 GAS로 SpreadSheet에 자동 전기한다】

최근 Wakatime이라는 도구를 사용하여 코딩 시간을 시각화 할 수 있도록 vscode에 설치하여 사용하고 있습니다 만, 주일에 그 데이터가 메일로 보내지기 때문에 GAS를 사용하여 SpreadSheet에 정기적으로 전기 하자.

wakatime을 사용하고 있고, 언어 별 사용 빈도등 기록해 두고 싶은 사람은 copipe하면 아마 갈 수 있다

다음 setTrigger()를 한 번 실행하면 7일마다 getWakaFunc()가 실행된다.
//定期実行関数
function setTrigger() { 
  ScriptApp.newTrigger('getWakaFunc').timeBased().everyDays(7).create();  
}

다음 함수를 실행하면 언어별 사용 시간만 추출할 수 있습니다.

→ 거친 흐름
굉장히 rt @ Wakachime. 이 m 에 일치하는 메일의 내용을 취득
・언어별 사용시간이 기재되어 있는 곳만 추출
· spreadSheet의 마지막 행에 쓰기
· 처리 된 라벨을 붙여 두 번로드되지 않도록합니다.

추가 ...... 2021/5/6
wakatime에서 보낸 주소가 변경되었습니다.
굉장히 rt @ Wakachime. 이 m -> Nore ply @ Wakachime. 이 m
//wakatimeから受け取ったメールを古い順に並べる関数
function getWakamail(){
  let WakaAddress = '[email protected]';
  var threads = GmailApp.search(`from:${WakaAddress} has:nouserlabels`);
  var reversedThreads = threads.reverse();
  return reversedThreads;
}

// wakatimeから受け取ったメールを転記する関数
function getWakaFunc(){
  var threads = getWakamail();
  threads.forEach((thread) => {
    let messages = thread.getMessages();
    let plainBodies = [];

    messages.forEach((message) => {
      var kennmei = message.getSubject().slice(1,7);
      if(kennmei === 'weekly'){
        plainBodies.push(message.getPlainBody());
      }else{
        plainBodies = null;
      }
    })

    if(plainBodies){
       const splitPlainBodies = plainBodies[0].split('\n')

       const totalTime = splitPlainBodies[0].match(/(..) hrs (..) mins/)
       //Logger.log(totalTime)

       const reportRange = splitPlainBodies[1].split('?')
       const startEndRange = reportRange[1].split('&').map((range) => {
                 let splitRange = range.split('=')
                 return splitRange[1]
       })
       //Logger.log(startEndRange)

       let languages = []
       let frag = 0 
       splitPlainBodies.forEach(body => {
          //Logger.log(body)
          if(body.match(/(Languages:)/)){
              frag = 1
          }
          if(body.match(/(Editors:)/)){
              frag = 0
          }
          if(frag === 1){
              languages.push(body)
          }
       })
       const mapLanguages = languages.slice(1, -2).map((lang) => {
          return lang.trim().split(':')
       })
       //Logger.log(mapLanguages)
       // spreadSheetの下に追加させる関数
       writeSpreadSheetFunc(startEndRange.join(' until '), totalTime, mapLanguages)
       var label = GmailApp.getUserLabelByName("Gas処理済み");
       thread.addLabel(label);

    }else{
      return;
    }

  })
}
// spreadSheetの下に追加させる関数
function writeSpreadSheetFunc(range, weekTotalTime, languages){

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    var lastRow = sheet.getLastRow() + 1;

    sheet.getRange(lastRow, 1).setValue(range);
    sheet.getRange(lastRow, 2).setValue(weekTotalTime);

    let n = 0;
    languages.forEach((lang) => {
        sheet.getRange(lastRow + n, 3).setValue(lang[0])
        sheet.getRange(lastRow + n, 4).setValue(lang[1])
        n++
    })
}

정규식을 사용하여 문자열을 정돈하는 것이 어려웠습니다. 덕분에 조금 익숙한

다음과 같이 정리할 수 있다.
최근에는 Node.js만

보다 상세한 데이터를 원하면 WakatimeAPI라든지 사용해 보겠습니다.

좋은 웹페이지 즐겨찾기