はじめに
宿曜占星術という、生年月日から27種類の「宿」を割り出し、相性を診断する占いがあります。これを提供するために、約60万行のExcelファイルを長年管理していました。
- 1500年分の日付データ(553年〜2100年)
- 27種類の宿曜とその関係性
- 特殊日(甘露日・金剛峰日など)のフラグ
ある日、「これ、自分以外誰も使えないな...」と気づきました。
結論: ExcelをSQLite + WordPressショートコードでWebアプリ化しました。
👉 完成したアプリ: https://www.5dmgmt.com/shukuyo/
Before: 私のExcel業務フロー
【従来のフロー】
1. お客様から生年月日を聞く
2. Excelで該当日を検索(Ctrl+F)
3. 宿曜を特定
4. 別シートの相性表を参照
5. エクセルで関係図を作成
6. お客様に説明
所要時間: 約15分/人
正直なところ:
- 自分しか使えない
- Excelファイルが壊れたら詰む
- 複数人の相性を見るのがめんどくさい
- お客様に「自分で調べたい」と言われても渡せない
After: Webアプリ化
【新フロー】
1. お客様がWebサイトにアクセス
2. 生年月日を入力
3. 瞬時に宿曜と関係図が表示
4. 他の人も追加して相性確認
所要時間: 約30秒/人
技術選定: なぜSQLite + WordPressなのか
検討した選択肢
| 選択肢 | メリット | デメリット |
|---|---|---|
| SpreadJS等でExcelそのまま | 移行コスト低 | 60万行は重い |
| MySQL + API | スケーラブル | サーバー費用増 |
| SQLite + WordPress | 軽量、既存サイト活用 | 大規模には不向き |
| Google Sheets API | 無料 | API制限、遅延 |
決め手
- 既存WordPressサイトに追加したかった → プラグイン形式が最適
- データは読み取り専用 → SQLiteで十分
- 月間数百アクセス程度 → 大規模対応は不要
- 自分でメンテしたい → シンプルな構成がいい
実装のポイント
1. Excel → SQLiteへの変換
私のExcelの構造:
| 日付 | 宿曜 | 曜日 | 特殊日 | 七曜陵逼 |
|------|------|------|--------|----------|
| 553/1/1 | 鬼 | 月 | | |
| 553/1/2 | 柳 | 火 | 甘露日 | |
| ... | ... | ... | ... | ... |
SQLiteのテーブル設計:
CREATE TABLE shukuyo_master (
date TEXT PRIMARY KEY,
shukuyo TEXT NOT NULL,
weekday TEXT,
special_day TEXT,
shichiyo_ryohitsu TEXT
);
CREATE INDEX idx_date ON shukuyo_master(date);
ポイント: 日付をPRIMARY KEYにすることで、検索が高速化(60万件でも数ミリ秒)
2. WordPressショートコードの設計
class Shukuyo_Kankei_Plugin {
public function render_shortcode($atts) {
ob_start();
include SHUKUYO_KANKEI_PATH . 'templates/shukuyo-kankei-template.php';
return ob_get_clean();
}
}
add_shortcode('shukuyo_kankei', array($this, 'render_shortcode'));
これで、WordPressの任意のページに [shukuyo_kankei] と書くだけでアプリが埋め込めます。
3. AJAX APIでデータ取得
private function get_shukuyo_data() {
$year = intval($_GET['year']);
$month = intval($_GET['month']);
$day = intval($_GET['day']);
$db = new SQLite3($db_path, SQLITE3_OPEN_READONLY);
$stmt = $db->prepare('SELECT * FROM shukuyo_master WHERE date = :date');
$stmt->bindValue(':date', $date_str, SQLITE3_TEXT);
$result = $stmt->execute();
$row = $result->fetchArray(SQLITE3_ASSOC);
wp_send_json_success(array(
'shuku' => $row['shukuyo'],
'youbi' => $row['weekday'],
'specialDay' => $row['special_day']
));
}
4. フロントエンドでSVG動的描画
27宿の関係図は、SVGテンプレートをJavaScriptで動的に書き換え:
// 27宿は循環するので、モジュロ演算で位置を計算
const targetShuku = SHUKU_CYCLE_ORDER[(baseIndex + svgShukuIndex) % 27];
// SVG内のテキスト要素を書き換え
textEl.textContent = targetShuku + '宿/' + SHUKU_YOMI[targetShuku];
ポイント: 27種類のSVGを用意するのではなく、1つのテンプレートを動的に変換
5. CSV一括登録(Excelとの連携は残す)
「内閣メンバーの相性を一気に見たい」という自分のニーズに対応:
// encoding-japanese ライブラリで文字コード自動判定
const detectedEncoding = Encoding.detect(codes);
const unicodeArray = Encoding.convert(codes, {
to: 'UNICODE',
from: detectedEncoding || 'SJIS' // Excel CSVはShift_JISになりがち
});
ポイント: ExcelでCSV出力 → アプリにドラッグ&ドロップ → 一括登録、という流れを維持
6. localStorageで自動保存
「登録した人が消えた!」を防ぐため、自動保存を実装:
window.shukuyoSaveToLocalStorage = function(silent = false) {
const saveData = {
peopleData: peopleData,
basePerson: basePerson,
savedAt: new Date().toISOString()
};
localStorage.setItem('shukuyo-kankei-data', JSON.stringify(saveData));
};
脱Excelで得られた効果
定量的な効果
| 指標 | Before | After | 改善率 |
|---|---|---|---|
| 1人あたりの診断時間 | 15分 | 30秒 | 97%削減 |
| 複数人の相性確認 | 1時間以上 | 3分 | 95%削減 |
| 自分の稼働 | 必須 | 不要 | セルフサービス化 |
定性的な効果
- お客様満足度向上: その場で結果が見られる
- 新規顧客獲得: 無料で試せるので、有料鑑定への導線に
- 自分の負担軽減: 単純作業から解放され、深い鑑定に集中できる
「活Excel」の部分
完全な脱Excelではなく、Excelの良さを活かした部分もあります:
- マスターデータの管理: 特殊日の追加・修正はExcelで行い、SQLiteに再インポート
- CSV一括登録: 調べたい人リストをExcelで管理 → CSV出力 → アプリで一括登録
- 結果のエクスポート: 将来的にCSVダウンロード機能を追加予定
まとめ
Excel業務のDX化で重要だと感じたこと:
- 全部置き換えない: Excelが得意な部分(マスターデータ管理、一括編集)は残す
- ユーザー体験を変える: 「検索して参照」から「入力して即表示」へ
- 技術選定は規模に合わせる: 60万行でもSQLiteで十分なケースもある
- 既存資産を活かす: WordPressサイトがあるならプラグイン化
「秘伝のExcel」を持っている方、まずはデータをSQLiteに移行するところから始めてみてはいかがでしょうか。
👉 完成したアプリ: https://www.5dmgmt.com/shukuyo/
生年月日を入力するだけで、あなたの宿曜と相性がわかります。ぜひ試してみてください。