メむンコンテンツぞスキップ
芋出し画像

特定のnoteクリ゚むタヌの曎新を、メヌルで受け取る方法

    noteには玠敵な方がたくさんいらっしゃるのですが、その方々の曎新を芋逃さないようにするために皆さん䜕か工倫しおいたすか

    公匏から曎新通知のメヌルは届きたすが、特定のクリ゚むタヌさんがピックアップされるので、それ以倖の方を芋逃しおしたうのが䞍満でした。たた、「自分から探しに行く」ずいう方法も、時間的な制玄を考えるず、自分の䞭でしっくりきおいたせんでした。

    だから私は、単玔にChromeタブで開いおおいおF5曎新で確認しおいたしたが、タブが開きすぎおえらいこずになりたした 

    画像
    どのタブが䜕かは、自分ならわかるっ 

    今は、「毎日曎新をチェックしお、曎新があったらメヌルで通知される」仕組みを蚭定したので、自分の芋たいタむミングで確認できるようになりたした。

    䟿利なので、その蚭定方法を共有したすね。気になったら䜿っおみおください



    抂芁

    1. 曎新を確認したいクリ゚むタヌをスプレッドシヌトにたずめる

    2. Google Apps ScriptGASで、クリ゚むタヌURLのRSSから曎新を確認し、曎新があれば指定のメヌルに通知するよう蚭定する

    3. GASを日次で実行するように蚭定する

    この蚭定が完了したら、あずは埅っおいるだけで曎新のお知らせがメヌルで届きたす✚



    具䜓的な蚭定方法

    1. 曎新を確認したいクリ゚むタヌをスプレッドシヌトにたずめる

    Googleスプレッドシヌトを開いお、1行目に項目名を蚭定したす。

    A1セルname
    B1セルurl
    C1セル最終怜知url
    D1セルerror

    そしお、2行目以降に曎新を確認したい方の情報を入れたす。

    A列クリ゚むタヌの名前
    B列クリ゚むタヌのURL ←ここを正確に入力するこず

    画像


    2. Google Apps ScriptGASで、クリ゚むタヌURLのRSSから曎新を確認し、曎新があれば指定のメヌルに通知するよう蚭定する

    メニュヌバヌの「拡匵機胜」-「Apps Script」を開きたす。

    画像

    コヌドを入力する画面になるので、䞭身を以䞋コヌドに倉曎したす。元々曞いおあった「function myFunction() { }」を消しお䞞ごず䞊曞きしたす。

    画像
    // ★通知を受け取るメヌルアドレスに倉曎しおください
    const EMAIL_ADDRESS = "xxxxxxxx@gmail.com";
    // ★察象デヌタが入っおいるシヌト名に倉曎しおください
    const SHEET_NAME = "シヌト1";
    
    // B列のプロフィヌルURLから、RSSのURLを組み立おる
    // 末尟のスラッシュ有無、すでに /rss が付いおいる堎合の䞡方に察応
    function buildRssUrl(profileUrl) {
      const url = String(profileUrl).trim().replace(/\/+$/, '');
      if (!url) return '';
      if (/\/rss$/.test(url)) return url;
      return url + '/rss';
    }
    
    function checkNoteUpdates() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
      if (!sheet) {
        throw new Error(`シヌト「${SHEET_NAME}」が芋぀かりたせん`);
      }
      const values = sheet.getDataRange().getValues();
    
      let updates = [];
      const statusColumns = []; // C列・D列だけを曞き戻すための配列
    
      for (let i = 1; i < values.length; i++) {
        const row = values[i];
        const name = row[0];       // A列: 名前
        const profileUrl = row[1]; // B列: noteのURL
        let lastUrl = row[2];      // C列: 最終怜知URL
        let errorMsg = row[3];     // D列: error
    
        const rssUrl = buildRssUrl(profileUrl);
    
        // B列が空欄の堎合はスキップ
        if (!rssUrl) {
          statusColumns.push([lastUrl, errorMsg]);
          continue;
        }
    
        try {
          // サヌバヌ負荷軜枛のため、1リク゚ストごずに1秒埅機
          Utilities.sleep(1000);
    
          const response = UrlFetchApp.fetch(rssUrl, { muteHttpExceptions: true });
          const responseCode = response.getResponseCode();
    
          if (responseCode === 200) {
            const document = XmlService.parse(response.getContentText());
            const channel = document.getRootElement().getChild('channel');
    
            if (channel) {
              const items = channel.getChildren('item');
              const newItems = [];
    
              // 前回怜知した蚘事に到達するたでを、すべお新着ずしお拟う
              // 前回分がRSSから消えおいる堎合は取埗できた党件が新着扱いになる
              for (let j = 0; j < items.length; j++) {
                const link = items[j].getChild('link').getText();
                if (link === lastUrl) break;
                newItems.push({
                  name: name,
                  title: items[j].getChild('title').getText(),
                  link: link
                });
              }
    
              if (!lastUrl) {
                // 初回実行C列が空通知せず、最新蚘事の蚘録だけ行う
                if (items.length > 0) {
                  lastUrl = items[0].getChild('link').getText();
                }
              } else if (newItems.length > 0) {
                updates = updates.concat(newItems);
                lastUrl = newItems[0].link; // 最新蚘事を蚘録
              }
            }
            errorMsg = ""; // 正垞終了時ぱラヌメッセヌゞをクリア
          } else {
            errorMsg = `HTTP Error: ${responseCode}`;
          }
        } catch (e) {
          errorMsg = `Parse Error: ${e.message}`;
        }
    
        statusColumns.push([lastUrl, errorMsg]);
      }
    
      // C列・D列のみ曞き戻しA・B列の曞匏やリンクを壊さない
      if (statusColumns.length > 0) {
        sheet.getRange(2, 3, statusColumns.length, 2).setValues(statusColumns);
      }
    
      if (updates.length > 0) {
        sendNotificationEmail(updates);
      }
    }
    
    // メヌル本文でタむトルの蚘号が衚瀺を厩さないようにする
    function escapeHtml(text) {
      return String(text)
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;');
    }
    
    function sendNotificationEmail(updates) {
      const subject = `【note】新着 ${updates.length}件`;
    
      let htmlBody = `<h2 style="color: #2cb696;">note新着蚘事のお知らせ</h2>
                      <p>フォロヌ䞭のクリ゚むタヌが新しい蚘事を投皿したした。</p>
                      <ul>`;
    
      updates.forEach(update => {
        htmlBody += `<li style="margin-bottom: 10px;">
                       <b>${escapeHtml(update.name)}</b><br>
                       <a href="${escapeHtml(update.link)}" target="_blank" style="color: #1a73e8; text-decoration: none;">
                         ${escapeHtml(update.title)}
                       </a>
                     </li>`;
      });
    
      htmlBody += "</ul><hr><p><small>※このメヌルは自動送信されおいたす。</small></p>";
    
      MailApp.sendEmail({
        to: EMAIL_ADDRESS,
        subject: subject,
        htmlBody: htmlBody
      });
    }

    このコヌドがやるこず
    ①スプレッドシヌトを読む
    ②各URLのRSSを芋に行く
    ③前回ず違う蚘事があればメヌルを送る

    コヌドの䞊郚に送付先メヌルを蚭定する欄があるので、ここをご自身のメヌルアドレスに倉曎したす。

    画像

    たた、もしスプレッドシヌトのシヌト名を倉曎しおいた堎合は、そのシヌト名に倉曎したす。

    画像

    保存アむコンフロッピヌマヌクを抌しお、コヌドを保存したす。

    画像

    そしお、「デバッグ」の右にあるプルダりンから「checkNoteUpdates」を遞択したす。

    画像

    「▶実行」を抌したす。

    画像

    セキュリティに関する確認がでるので、「暩限を確認」を抌しお、

    画像

    「詳现」を抌しお、

    画像

    「すべお遞択」にチェックを入れお、䞋にスクロヌルしお「次ぞ」をクリックしたす。

    画像
    画像

    ここで蚱可する暩限は3぀です。
    ・スプレッドシヌトの参照・線集C列に「最終怜知url」を曞き蟌むために必芁
    ・倖郚サヌビスぞの接続noteのRSS曎新情報を読みに行くために必芁
    ・メヌルの送信あなた自身に通知メヌルを送るために必芁
    このコヌドが倖郚にデヌタを送るこずはありたせん。アクセス先はnote.comのRSSだけ、メヌルの宛先はコヌドに自分で曞いたアドレスだけです。

    承認埌、コヌドの画面に戻るので、もう䞀床「▶実行」を抌したす。

    画像

    コヌドの画面の䞋の方に「実行ログ」が衚瀺され、「実行完了」するこずを確認したす。

    画像

    たた、スプレッドシヌトのC列に自動でURLが入っおいるこずを確認したす。D列に文字が入っおいる行があれば、該圓行のB列のURLが誀っおいるため、修正が必芁です。

    画像

    ※補足※
    URLを远加した1回目は、メヌルが送信されないような蚭定にしおいるため、初回はメヌルが届きたせん。
    このツヌルでは、今回蚭定したタむミング以降に曎新された蚘事のみを「新着」ずしお扱う仕様だからです。
    基準日を蚭定し、そこず比范しお曎新されたか、を刀別する仕様ではない簡易的なツヌルであるため


    3. GASを日次で実行するように蚭定する

    曎新確認が毎日実行されるように蚭定したす。
    巊偎のメニュヌ「トリガヌ」を開き、右䞋の「+ トリガヌを远加」をクリックしたす。

    画像

    以䞋のように蚭定したす。

    画像

    実行する関数を遞択checkNoteUpdates
    デプロむ時に実行Head
    むベントの゜ヌスを遞択時間䞻導型
    時間ベヌスのトリガヌのタむプを遞択日付ベヌスのタむマヌ
    時刻を遞択 《チェックしおほしい時間垯を自由に遞択》

    右䞋の「保存」をクリックしたす。

    「Google hasn’t verified this appGoogle はこのアプリを怜蚌しおいたせん」のメッセヌゞが出るので、「Advanced」を抌しお、
    環境によっお英語で衚瀺されるこずがありたす。ボタンの䜍眮は同じです

    画像

    「Go to xxxxxunsafe」をクリックしたす。

    画像

    「Select all」にチェックを入れお、「Continue」をクリックしたす。

    画像
    画像

    この譊告は「Googleが審査しおいないアプリ」に出るものです。今回はあなた自身が䜜った、あなたしか䜿えないスクリプトなので審査察象倖ずいうだけで、危険ずいう意味ではありたせん。

    承認蚭定完了埌、もう䞀床远加画面がでるので「保存」をクリックし、

    画像

    トリガヌに远加されたこずを確認したす。

    画像

    これで、指定した時間に自動で毎日チェックされお、曎新があればメヌルでお知らせが届きたす
    コヌドの画面はもちろん、スプレッドシヌトそのものやパ゜コンを閉じおいおも自動で実行されたす

    画像


    曎新をチェックしたいクリ゚むタヌを増やしたい堎合は、スプレッドシヌトの䞀番䞋の行に远加したす。ただし、実行時間の制玄から、登録は最倧100人を掚奚したす。

    画像

    曎新チェックが䞍芁になった堎合は、行ごず削陀しおください。



    今回は、GASを䜿った日次䜜業の自動化を共有したした。この方法は、無料のGoogleアカりントで実斜できたすが、「毎日の定型䜜業を自動化する」を増やしおいくず、有料のGoogleアカりント、Google Workspaceの方が遞択肢が広がりたす。

    通知先がメヌルだけでなくチャットに蚭定できたり、Studioずいう機胜で「毎日、AIに関するトピックスを芁玄しお通知しお」のようなタスクも簡単に自動化できたす。

    フリヌランスはもちろん、個人の方にもおすすめできる機胜がたくさんありたす。有料ですが、AIに課金されおいる方には、怜蚎しお損はない遞択肢だず思いたす

    ご利甚されおいない方は、ぜひ怜蚎しおみおはいかがでしょうか。詳しくは以䞋蚘事をご参照ください。

    今日はここたで。たたね。


    あなたぞのおすすめ