【GAS】MSのドキュメントを簡単スクレイピングして差分があったら更新メールを送る

スプレッドシートのIMPORTHTML関数とGASで更新を検知できたので共有。
※一応MSドキュメントの利用規約みましたが禁則事項スクレイピングについて記載はありませんでした。
 サイトによってはNGですので気を付けてください。

▼みなきゃいけない対象サイト

docs.microsoft.com

▼やりたいこと

新しい分野だからか、この用語集がいつの間にか更新されることがあるので
変更タイミングがあったらメール通知。あわよくば差分も取りたい。

▼やったこと

最初はhtmlparse的なライブラリを使おうと思っていたのですが、
スプレッドシート関数のIMPORTHTML関数で簡単に取得できました。

スプレッドシートの用意

newシートにIMPORTANTHTML関数を図中①のように入力
もとの用語集が表形式になっていたのでIMPORTHTML関数でtableを取得でいとも簡単にいけました。

表がとれたらnewシートを複製してoldシートと名付け、値貼りしておく

newのほうの表の横(今思うと表の列が伸びる可能性もあるので、表の左に書いておけばよかった)に
newとoldの文言の差分を抽出できるようにEXACTとCONCATENATE関数を合わせたものを入れておく(図中②)
=EXACT(CONCATENATE(A1,B1),CONCATENATE(old!A1,old!B1))

COUNTIF関数でnewのTRUE/FALSEの値の数をカウント(図中③)


f:id:twixoreo:20210513001253p:plain


スクリプトの流れ

日次でnewからoldへ表をコピーして、
表に差分=F2セルにFALSEが1つ以上あった場合は
アーカイブとして日付のシートを作成してメールを送る。


スクリプトの用意

  /* コピーして差分を確認する関数 */
function copySheet() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
 
  const sheet_new = ss.getSheetByName('new'); 
  const sheet_old = ss.getSheetByName('old'); 
 
  const lastRow = sheet_new.getLastRow();
  const lastColumn = sheet_new.getLastColumn();
 
// newからoldへコピペ
  const copyValue = sheet_new.getRange(1,1,lastRow,lastColumn).getValues(); 
  sheet_old.getRange(1,1,lastRow,lastColumn).setValues(copyValue); 

// FALSEがあったら日付のシートを作成してアーカイブ作成。メール送信。
  if (sheet_old.getRange("F2").getValue() > 0){
    console.log("FALSEがあります");
    const sheet_copy = sheet_old.copyTo(ss);
    const yyyymmdd = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd');
    sheet_copy.setName(yyyymmdd);
    sendMail();
  }
}


  /* メールを送信する関数 */
function sendMail() {
let strTo = PropertiesService.getScriptProperties().getProperty("EMAIL_ADDRESS");
let strSubject = "【自動送信】Workplace Analytics 用語集に更新がありました";
let strBody = PropertiesService.getScriptProperties().getProperty("SS_ADDRESS");
    + "\n\n▼元用語集URL\n" 
    + "https://docs.microsoft.com/ja-jp/workplace-analytics/use/glossary";

  GmailApp.sendEmail(
    strTo,
    strSubject,
    strBody
  ); 
}

余談ですがPowerQueryの表取得の機能でも簡単に表を取得できました🎉