見出し画像

システムエンジニア流|生成AIでnoteの「スキ」を自動集計する方法

以前、noteでスキをもらいやすい時間帯を調べるために、スキされた時間を集計しました。

これは、どのようにスキを集計したと思いますか?


「スキされました」メールを自動で集計する


「スキされました!」という通知メールを1件ずつ確認してExcelへ記入するのは大変です。

スキ1件につき20秒でExcelに記入した場合、スキ50件で1,000秒 ≒ 16.6分かかります。100件だと30分以上です。

記事の投稿のたびに続けるとかなりの作業時間になりますが、プログラムだと、毎日1時に自動実行されるため、全く時間がかかりません。生成AIは、文章を作るだけではなく、このような小さな自動化にも活用できます。


大切なのは「何をしたいか」を明確にすること


プログラムと生成AIは、非常に相性のよい組合せです。

プログラムの基礎知識があれば、生成されたコードの確認や修正に役立ちますが、最初の段階で重要なのは高度なプログラミング知識よりも、
何を実現したいか
を明確にすることです。

やりたいことや条件を具体的に伝えられれば、生成AIにプログラムの原案を作ってもらえます。

今回は、noteのスキを集計するために、次の処理を自動化しました。

Gmailで受信した「スキの通知」メールを取得し、Google スプレッドシートに一覧として保存する。

私は、Gmailで受信したスキの通知メールに、自動的に「noteスキ」というラベルが付くように設定しています。

そのため、生成AIには、

Gmailで受信したメールのうち、「noteスキ」のラベルが付いているメールを取得してください。

と伝えました。

さらに、毎日深夜1時に実行するため、対象は前日の0時から23時59分までに受信したメールだけにします。また、今回はメールの「件名」と受信した「日時」だけわかればいいので、その旨も伝えます。

GmailとGoogleスプレッドシートを使うので、GoogleのGemini 2.5にお願いしました。

Gmailで受信したメールで「noteスキ」のラベルが付いているメールを取得してください。次にプログラムを実行した前日の00:00:00~23:59:59のメールのみ抽出して、「件名」と「受信日時」をGoogleスプレッドシートに保存するプログラムを生成してください。

(生成されたプログラムを多少加工していますが)期待通りのプログラムが生成されました。

function exportLabeledEmailsOfPreviousDayFiltered() {
  // エクスポートしたいラベル名を入力
  const LABEL_NAME = "noteスキ";

  // 検索クエリを作成
  const searchQuery = "label:" + LABEL_NAME;

  // 結果を格納する配列
  let data = [];

  // ヘッダー行を追加
  data.push(["件名", "日付"]);

  try {
    // 指定したラベルを持つメールスレッドを検索
    // ここでは最大500件を取得。大量のメールを処理する場合はページング処理が必要です。
    const threads = GmailApp.search(searchQuery, 0, 500);

    if (threads.length === 0) {
      Logger.log("指定されたラベルのメールは見つかりませんでした。");
      Logger.log("指定されたラベル '" + LABEL_NAME + "' のメールは見つかりませんでした。");
      return;
    }

    // プログラム実行前日の日付範囲を定義
    const now = new Date();
    // スクリプトが実行されるタイムゾーンを取得
    const scriptTimeZone = Session.getScriptTimeZone();

    // 前日の開始時刻 (00:00:00) を計算
    const startOfYesterday = new Date(now);
    startOfYesterday.setDate(now.getDate() - 1);
    startOfYesterday.setHours(0, 0, 0, 0); // 時刻を00:00:00に設定

    // 前日の終了時刻 (23:59:59) を計算
    const endOfYesterday = new Date(now);
    endOfYesterday.setDate(now.getDate() - 1);
    endOfYesterday.setHours(23, 59, 59, 999); // 時刻を23:59:59.999に設定

    Logger.log("検索対象日: " + Utilities.formatDate(startOfYesterday, scriptTimeZone, "yyyy/MM/dd HH:mm:ss") + " から " + Utilities.formatDate(endOfYesterday, scriptTimeZone, "yyyy/MM/dd HH:mm:ss"));

    // 各スレッドを処理
    threads.forEach(thread => {
      // スレッド内のすべてのメッセージを取得し、日付でフィルタリング
      const messages = thread.getMessages();

      messages.forEach(message => {
        const messageDate = message.getDate(); // メッセージの日付を取得

        // メッセージの日付が前日の日付範囲内にあるかチェック
        if (messageDate >= startOfYesterday && messageDate <= endOfYesterday) {
          const subject = message.getSubject();
          data.push([subject, messageDate]);
        }
      });
    });

    if (data.length === 1) { // ヘッダー行のみの場合
        Logger.log("前日のメールは見つかりませんでした。");
        return;
    }

    // 新しいスプレッドシートを作成
    const ss = SpreadsheetApp.create("Gmailラベル '" + LABEL_NAME + "' 前日メール一覧");
    const sheet = ss.getActiveSheet();

    // データをスプレッドシートに書き込み
    sheet.getRange(1, 1, data.length, data[0].length).setValues(data);

    Logger.log("スプレッドシートが作成されました: " + ss.getUrl());

  } catch (e) {
    Logger.log("エラーが発生しました: " + e.toString());
  }
}

作成したプログラムは、Google Apps Scriptの時間主導型トリガーを使い、毎日深夜1時に自動実行するように設定しています。

Google Apps Scriptの設定方法も生成AIに質問できますが、生成されたプログラムをそのまま実行するのではなく、権限や処理内容を確認し、少ないデータで試してから使うことをおすすめします。


小さな自動化が、改善の入口になる


今回自動化したのは、noteのスキを集計するという小さな作業ですが、自動化によってデータが継続的に蓄積されると、次のような分析ができます。

①何時にスキが多い?
②スキをくれる常連さんは誰?
③記事の内容とスキの時間帯に関係はある?

人が毎日手作業で集計する方法では、途中で面倒になって止めてしまうかもしれません。しかし、一度仕組みを作って自動化すれば、1カ月、半年、1年と、継続してデータを蓄積できます。

生成AIの価値は、文章を早く作れることだけではありません。
面倒で続かなかった作業を、継続できる仕組みに変える。」

システムエンジニアとしては、繰り返し作業を自動化して作業効率を上げるる使い方もご提案したいです。


生成AIの活用例をもっと知りたい方へ

生成AIは、情報整理、データ分析、画像作成、プログラムによる自動化など、さまざまな場面で活用できます。

私が実際に試した生成AIの活用例を、次の記事にまとめています。


いいなと思ったら応援しよう!

村田 裕樹 最後までお読みいただきありがとうございました! サポートもうれしいですが「スキ」をしていただけると大変励みになります!!