1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excelを更新するだけでWebサイトが自動更新される仕組みをGitHub Actionsで作った

1
Posted at

はじめに
無料で使えるAIツールを「やりたいこと」から探せる検索サイトを、GitHub Pagesで公開しています。
https://ma0531.github.io/ai-tools-search-guide/
screenshot-pc.png
340件以上のAIツールを載せているのですが、データが増えるにつれて更新作業がつらくなってきました。そこで、Excelを更新してアップロードするだけで、サイトのデータが自動で作り直される仕組みをGitHub Actionsで作りました。
この記事では、その仕組みと、実際につまずいた点を紹介します。
:::note info
このサイトと仕組みは、AnthropicのAI「Claude Opus 5.5」の支援を受けて作成しました。コードや構成の多くはClaudeと相談しながら作り、動作の確認と運用は自分で行っています。
:::
この記事で分かること
ExcelのデータをGitHub Actionsで自動的にJSONへ変換する方法
入力ミスがあったときに、何行目が間違っているか教えてくれる仕組み
GitHubをブラウザだけで操作していて、実際につまずいたこと
困っていたこと
サイトのデータは、ai-tools.json という1つのJSONファイルに入っています。1件分はこんな形です。

{
  "name": "ChatGPT",
  "url": "https://chatgpt.com",
  "country": "アメリカ",
  "category": ["パーソナルアシスタント", "情報検索・リサーチ"],
  "strengths": ["会話・文章作成・要約・翻訳を1つで", "..."],
  "pricing": "無料枠あり"
}

これが340件以上並んでいて、GitHubの画面上で直接編集していました。すると、次のような問題が起きます。
カンマを1つ忘れるだけで、サイト全体が表示されなくなる
長すぎて、どこを直しているのか分からなくなる
「料金タイプ」などに決まった言葉以外を入れても気づけない
ふだん事務の仕事でExcelを使っているので、「Excelで管理できれば楽なのに」と思ったのがきっかけです。
仕組みの全体像

ポイントは、入力ミスがあるときは変換を止めることです。JSONは書き換わらないので、間違えてもサイトが壊れることはありません。
① Excelの設計
Excelには3つのシートを用意しました。
シート 内容
使い方 入力ルールと反映手順のメモ
AIツール一覧 1行=1つのAI
カテゴリ一覧 使えるカテゴリ名の一覧
2_AIツール一覧シート.png
入力ミスを減らすために、Excelのデータの入力規則(▼で選べるリスト)を使っています。
料金タイプ:完全無料 / 無料枠あり / トライアルのみ
日本語対応:◯ / △ / ×
対応端末:PC+スマホ / PCのみ / スマホのみ
「強み」のように複数の項目がある列は、1つのセルの中で Alt+Enter で改行して入れています。
② ExcelをJSONに変換するPythonスクリプト
変換には、PythonのExcel用ライブラリ openpyxl を使いました。やっていることは次の3つです。
1行目の見出しから、どの列に何が入っているかを調べる
2行目以降を1行ずつ読み、入力ミスがないか確認する
ミスがなければJSONに書き出す
入力チェックの部分を抜粋します。

PRICING = {"完全無料", "無料枠あり", "トライアルのみ"}

for r, row in enumerate(ws.iter_rows(min_row=2, values_only=True), start=2):
    values = {h: text(row[i]) for h, i in col.items()}
    if not any(values.values()):
        continue  # 空の行は無視

    where = f"{r}行目({values['AI名'] or '名前なし'})"

    # 必須の項目が空になっていないか
    for h in REQUIRED:
        if not values[h]:
            errors.append(f"{where}:「{h}」が空です")

    # 決まった言葉が入っているか
    pricing = values["料金タイプ"]
    if pricing and pricing not in PRICING:
        errors.append(f"{where}:料金タイプは「完全無料」「無料枠あり」「トライアルのみ」のどれかにしてください(今:{pricing})")

# ミスが1つでもあれば、JSONを書き換えずに終了
if errors:
    print("❌ 入力ミスが見つかったため、JSONは更新しませんでした:")
    for e in errors:
        print(f"  ・{e}")
    sys.exit(1)

「何行目の・どの項目が・どう間違っているか」を日本語で表示するようにしたのがこだわりです。エラーの意味を調べなくても、そのままExcelを直せます。
ほかにも、次のようなチェックを入れています。
AI名の重複
URLが http で始まっているか
カテゴリがサイトに存在する名前か
「○」(まる)と「◯」(大きいまる)のような似た記号は、自動でそろえる
③ GitHub Actionsの設定
.github/workflows/excel-to-json.yml に、次の設定を置いています。

name: ExcelからJSONに変換

on:
  push:
    paths:
      - "data/ai-tools.xlsx"   # このファイルが更新されたときだけ動く
  workflow_dispatch:           # 手動実行もできる

permissions:
  contents: write

jobs:
  convert:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: pip install openpyxl
      - name: ExcelをJSONに変換(入力ミスがあればここで止まります)
        run: python scripts/excel_to_json.py
      - name: 変換したJSONを保存
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git add data/ai-tools.json
          if git diff --cached --quiet; then
            echo "JSONに変更はありませんでした"
          else
            git commit -m "ExcelからJSONを自動更新"
            git push
          fi

on.push.paths で Excelファイルが更新されたときだけ 動くようにしているので、ほかのファイルを直しただけでは実行されません。
④ 入力ミスがあるとどうなるか
試しにわざと間違えてアップロードすると、Actionsタブに赤い ✕ が付き、次のように表示されます。
3_入力ミスのエラー表示.png

❌ 入力ミスが見つかったため、JSONは更新しませんでした:
  ・3行目(Claude):カテゴリ「画像つくる」はサイトにありません
  ・4行目(Google Gemini):料金タイプは「完全無料」「無料枠あり」「トライアルのみ」のどれかにしてください(今:無料)
  ・6行目(ChatGPT):AI名が 2行目 と重複しています

GitHubから失敗のお知らせメールも届くので、気づき忘れもありません。
つまずいたこと
ここからは、実際にハマった点です。GitHubをブラウザだけで操作している人は、同じところでつまずくかもしれません。

  1. フォルダごとアップロードしたら、1段深い場所に入った
    zipを展開したフォルダをそのままドラッグしたところ、管理用ファイル/scripts/excel_to_json.py のように、余計なフォルダの中に入ってしまいました。Actionsでは次のエラーになります。
python: can't open file '.../scripts/check_links.py': [Errno 2] No such file or directory

解決策:展開したフォルダの中に入って、中身のフォルダだけをドラッグする。アップロード画面に表示されるファイルのパスを確認するのが確実です。
2. Excelをアップロードしたのに、変換が動かない
data フォルダに入れるつもりが、リポジトリのトップにアップロードしていました。設定で data/ai-tools.xlsx だけを見張っているので、場所が違うと動きません。
解決策:GitHubの「Upload files」は、今開いているフォルダに保存されます。画面上部の場所表示が リポジトリ名 / data / になっているか確認してからアップロードします。
3. スプレッドシートに貼り付けたら、下のセルが上書きされた
家にxlsx対応のExcelがないため、Googleスプレッドシートで編集しています。改行入りの文章をセルを選んだ状態で貼り付けたら、1行ずつ下のセルに分かれて入り、別のAIのデータを上書きしていました。
解決策:セルをダブルクリックして編集状態にしてから貼り付ける。
ちなみにこのミスは、変換時の「強みが1項目です(4項目がおすすめ)」という注意表示で気づけました。チェックを入れておいてよかったと思った瞬間です。
おまけ:リンク切れの自動チェック
同じGitHub Actionsで、週に1回、全AIサイトのURLを開いて確認する仕組みも作りました。結果はGitHubのIssuesに自動で書き込まれます。
4_リンク切れチェックの結果.png
実際に動かしてみると、サービス名が変わっていたAI(例:Formula Bot → Better Analyst)や、証明書が切れて危険な表示が出るサイトが見つかりました。AIツールは変化が速いので、自動で見張ってくれるのはかなり助かっています。
ただ、大手のサイトは自動チェックのアクセスを拒否する(403)ことが多く、毎週同じサイトが報告されて読みにくくなりました。そこで、「確認済みリスト」に登録したサイトは報告から外す工夫もしています。
まとめ
Excelで管理 → GitHub Actionsで自動変換 にしたことで、JSONを直接触ることがなくなりました
入力ミスがあれば変換を止めて、場所を日本語で教えてくれるので、サイトが壊れる心配がなくなりました
事務作業で使い慣れたExcelを入り口にできるので、プログラミングに詳しくなくても続けやすいと感じています
同じようにGitHub Pagesでデータの多いサイトを作っている方の参考になればうれしいです。
リンク
サイト:https://ma0531.github.io/ai-tools-search-guide/
リポジトリ:https://github.com/ma0531/ai-tools-search-guide

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?