いつも通り複数のサイトをチェックしていました。最近参画したプロジェクトで、毎朝しなければならない日次チェックです。対象は20サイトあります。

ブログを開く。更新なし。別のブログを開く。更新なし。YouTubeを見る。更新なし。「あ、今日も何もないな」と思いながら、その日の確認を終える。この「何もない」を確認するために、毎日時間を使っていました。

こういう作業は、あまりにも日常すぎて「改善」と呼ぶほどではないように見えます。でも冷静に考えると、毎日最速でやっても15分、月換算で5時間近くかかります。十分、業務改善を検討していい作業です。

正直にいうと、私はこういったルーティンワークがあまり得意ではありません。日次、週次、月次、四半期、半期、年次…と、決まったタイミングで決まった作業が増えれば増えるほど、手順書が膨らめば膨らむほど、地味にストレスがたまります。だからこそ、これが自動化できるだけでも、あるいは「自動化できると分かった」だけでもかなり大きな収穫です。

最初にやったのは、全部をいきなり自動化することではなく、Inoreader を使って更新情報をまとめることでした。これで、更新があったものだけを一覧で確認できるようになり、少なくともURLをひとつずつ開いて「何もない」ことを確認する作業はかなり減りました。

ただ、それでも最後の面倒は残ります。更新があったら、タイトルとURLをコピーしてExcelに貼り付ける、投稿された日付を入力する。この作業です。量は減ったけれど、作業そのものは消えていない。そこでようやく、「ここまで来たなら、この先も機械にやらせていいのでは」と考えるようになりました。

今回やったことを分解するとシンプルです。更新情報を取得し、新しいものだけを判定し、既存のExcelフォーマットを壊さないように追記する。言葉にするとそれだけですが、実務で使える形にするには、それなりに考えるポイントがありました。

たとえば、単にRSSを読んで書き込むだけでは不十分です。実際には、既存URLとの重複を避けたり、指定日以降のデータだけに絞ったり、Excel上では最新データが一番下に来るように順序を制御したりする必要があります。処理のイメージとしては、こんな感じです。

pending_items = []for entry in feed.entries:
    dt = parse_feed_datetime(entry)
    url = normalize_url(entry.get("link", ""))    if dt is None or dt < DATE_CUTOFF:
        continue
    if not url or url in existing_urls:
        continue    pending_items.append({
        "title": entry.get("title", "").strip(),
        "url": url,
        "dt": dt,
    })pending_items.sort(key=lambda x: (x["dt"], x["url"]))

ここでやっているのは、単なる取得ではなく、実運用向けのフィルタリングと整列です。特に最後の sort は地味ですが重要で、新しいものをそのまま上から流し込むのではなく、古い順に追記することで、Excel上では一番下が最新データになるようにしています。こういう細かい仕様は、実際に使う段階になると効いてきます。

さらに、今回少し面倒だったのは、単に値を書くだけではなく、既存のExcelフォーマットに合わせて追記する必要があることです。日付の列は中央寄せ、タイトルは左寄せ、URLはハイパーリンク化、しかも余計な塗りつぶしや罫線はつけない。書式コピーに頼ると既存行の色や罫線まで踏襲してしまうので、そこはあえて毎回明示的に整えるようにしました。

def set_url_cell(ws, col, row, url, align):
    cell = ws.Range(f"{col}{row}")
    try:
        if cell.Hyperlinks.Count > 0:
            cell.Hyperlinks.Delete()
    except Exception:
        pass    ws.Hyperlinks.Add(Anchor=cell, Address=url, TextToDisplay=url)
    cell.Font.Name = "MS Pゴシック"
    cell.Font.Size = 10
    cell.Font.Bold = False
    cell.Interior.Pattern = -4142
    cell.HorizontalAlignment = align

このあたりは、「動けばいい」ではなく、「既存運用にちゃんと乗るか」を意識した部分です。自動化の難しさはアルゴリズムそのものよりも、むしろこういう周辺仕様にある気がしています。

連番が必要なシートでは、A列の数式もそのまま踏襲するようにしました。値を入れるのではなく、既存運用に合わせてExcel関数を書き込んでいます。

cell.Formula = f'=IF(B{row}<>"", COUNTA($B$2:B{row-2})+1, "")'

結果として、やることはほんの数ステップになりました。スクリプトを実行して、更新結果を確認するだけ。今まで15〜30分かかっていた作業が、5分以内で終わるようになりました。

今回の内容は、特定の監視対象やExcelに依存しているように見えて、実はかなり汎用的です。外部ソースから情報を取る、条件で絞る、既存フォーマットに合わせて出力する。この流れは、レポート作成、更新監視、データ整理、通知処理など、いろいろな業務に応用できます。

そして今回いちばん大きかったのは、AIを使えば、これまであまりコードを書いたことがない自分でもここまで持っていけたことです。もちろん、チーム共用の仕組みをいきなり作るには検証が足りませんし、フォーマット変更への耐性、イレギュラー時の挙動、運用への影響範囲など、確認すべき点はまだあります。だから現時点では個人利用にとどめています。

それでも、「これは自動化できる」「しかも自分でも作れる」という感触が得られたのは大きかったです。派手な改善ではないかもしれませんが、こういう毎日の小さな面倒が消えるだけで、気持ちはかなり軽くなります。

ビバ、自動化。

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。