【GAS】MSのドキュメントを簡単スクレイピングして差分があったら更新メールを送る
スプレッドシートのIMPORTHTML関数とGASで更新を検知できたので共有。
※一応MSドキュメントの利用規約みましたが禁則事項にスクレイピングについて記載はありませんでした。
サイトによってはNGですので気を付けてください。
▼みなきゃいけない対象サイト
▼やりたいこと
新しい分野だからか、この用語集がいつの間にか更新されることがあるので
変更タイミングがあったらメール通知。あわよくば差分も取りたい。
▼やったこと
最初は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の値の数をカウント(図中③)
▼スクリプトの用意
/* コピーして差分を確認する関数 */ 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の表取得の機能でも簡単に表を取得できました🎉