【Google Apps Script】可茂IT塾の最新ブログタイトルをLineで知らせる

image

今回やったこと

可茂IT塾のブログも増えてきたので、ブログが更新されたらLineで知らせるというスクリプトをGoogle Apps Scriptで作ってみました。対象のサイトをスクレイピングして最新のブログタイトルを取得し、以前に取得したブログタイトルと比較して新しいブログがあれば、そのタイトルをLine で知らせます。javascriptの勉強も兼ねて作ってみました。
以前のブログLINEメッセージを送信するSymbol価格を取得するもよかったら参考にしてみてください。

環境

  • Google Spreadsheet
  • Google Apps Script

実行画面(例)

ブログタイトル取得

Spreadheet

Line通知

Line

コード全文

まずは、コード全文をあげます。
コードの中に適宜コメントアウトとconsole.log()がありますので、これらを参考に動かしてみてください。

function infoBlog() {
 
 // 今回利用するスプレッドシートを設定.
 let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet');
 
 // URLからHTMLを取得
 const url = "https://www.kamo-it.org/blog/";
 const html = UrlFetchApp.fetch(url).getContentText('UTF-8'); 

 // パースする(htmlから必要な部分を抜き出す)
 let blog = Parser.data(html)
                 .from('blog-post-content')
                 .to('</a>')
                 .iterate();
 // console.log(blog); // 確認

 // 最新のブログリストを取得
 let latest_blog_title=[];
 for(let i = 0; i < blog.length; i++){
   var a = blog[i].replace(/.*">/,""); // 正規表現で置き換え
   latest_blog_title.push(a);
 }
 // console.log(latest_blog_title); // 確認

 // 今までのブログタイトルをシートの特定の列から値のある分だけ配列で取得する
 let lastRow = sheet.getLastRow(); // シートのデータのある最終行を取得する
 // console.log(lastRow); // 確認
 const range = sheet.getRange(1,2,lastRow); // 1行目2列目(B1)から最終行までの範囲のデータを配列で取得する
 // console.log(range.getValues()); // 確認

 // 上記で取得した配列が二次元配列なので最新のブログリストと比較できるように
 // 二次元配列を一次元配列に変換する(flat()を使う)
 let current_blog_title = range.getValues().flat();
 // console.log(current_blog_title); // 確認

 // 最新のブログリストと今までのブログリストを比較して,trueかfalseかを判定
 let isSame = (latest_blog_title.toString() == current_blog_title.toString());
 // console.log(isSame); // 確認

 // 新しいブログタイトルを抽出する
 // 最新のブログリストに対して
 let result = latest_blog_title.filter(itemA => 
   // 今までのブログリストに存在しない要素が返る
   current_blog_title.indexOf(itemA) == -1
 );  
 console.log(result); // 確認

 // 最新のブログリストと今までのブログリストが違っていた場合以下の処理をする
 if (isSame == false) {  
   // lineで知らせる(common_functionライブラリからsendLine関数を呼び出している)
     common_function.sendLine("新しいブログが更新されました!");
   // 新規のブログタイトルを通知
   for (let i = 0; i < result.length; i++) {
     common_function.sendLine(result[i]);
     // console.log(result[i]);  //確認
   }
   // スプレッドシートのブログタイトルを更新する
   for(let i = 0; i < blog.length; i++){
   sheet.getRange(i+1,1).setValue(latest_blog_title.length - i);
   sheet.getRange(i+1,2).setValue(latest_blog_title[i]);   
   }
 }
}

説明

URLからHTMLを取得,パースする(htmlから必要な部分を抜き出す)

可茂IT塾のブログのURLは、https://www.kamo-it.org/blog/
ここからほしい部分のhtmlを見つけます。ブログのトップ画面で、F12キーを押すと以下のような画面になります
Line elementタブを選択して、①を押すと色が変わるので、その状態でポインターを動かすとポインター周辺の色が変わります。
自分のほしい情報のある場所の色が変わったら、そこでクリック②すると、右側の画面にその位置のhtmlが示されます。
今回は以下のようなhtmlになっています。
html

ここからblog-post-content<a>タグを抜き出せばよいことがわかります。

正規表現で置き換え

パースした文字列は最初は以下のようになっています。
'"><h3><a href="/blog/36/">【5分】FlutterでQRコードの生成・読み取りする方法まとめ'
余分な文字列があるので、置き換えるために正規表現を使います。
blog[i].replace(/.*">/,"")
">から左側の文字列を""(空白)に置き換えるということをしています。

まとめ

他にもいろいろな構文を使っていますが、ここでの説明は省きます。 今回のコードを定期的に自動実行して(方法は前のブログを参照してください)ぜひ、可茂IT塾のブログを読んでください。

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (112)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (9)Firebase (7)riverpod (6)React (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)ヒーター (1)作業効率 (1) (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)経験談 (1)フリーランス (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More