Day 172|Week 11キックオフ:Box→BigQuery→Lookerを“毎朝まわる”にする――「Box Data Weaver」始動
こんにちは、こんです🦊
100日チャレンジ2回目のWeek 11 / Day 1(通算 Day 172)です。
先週(Week 10)はSlack勤怠 v3 を「入れる→使える→つながる→課金が回る」SaaSまで押し上げました。今週は主旨をガラッと切り替え、データ基盤の自動化がテーマ。社内に点在するCSV(Box)をBigQueryに自動集約→Looker Studioで常時可視化する軽量パイプライン「Box Data Weaver」を立ち上げます。目的はただ1つ――手作業の集計・加工をゼロにして、意思決定を“毎朝の定常運転”にすること。
いま週のゴール(Week 11)
GASでBox→BigQueryの定期転送を構築(複数フォルダ/複数CSVに対応、未処理だけ拾う)
Looker Studioプロトタイプ(返品×T-sort 稼働)を作成し、関係者に共有&フィードバック収集まで完走(Day 7)
来週の改善バックログをNotionに整備(可視化追加/スキーマ調整/データ品質チェック)
今日やったこと(Day 172|KICKOFF)
1) 企画スコープの確定と“完成定義(DoD)”
対象データ:EC返品CSVとT-sort 稼働CSV。Box上の保管場所と列項目を棚卸し。これをBigQueryの2テーブル(ec_returns / tsort_logs)に受ける前提でスキーマ策定。
成功の条件:
BoxにCSVを置くと翌朝までにBQへ反映
Lookerのダッシュボードが常時最新
手動オペ0(トリガー運転+処理ログ)
2) Week設計(7日プラン)
Day 1–2:要件整理/GCPプロジェクトとBQスキーマ(box_raw_data データセット)作成、Box OAuth準備。
Day 3–4:GASでBox接続→CSV取得→BQ挿入のパイプ実装(未処理判定・ログ含む)。
Day 5:全体結合&時間トリガー設定(毎朝)。
Day 6:Looker Studioのプロトタイプ作成(返品・稼働の基本可視化)。
Day 7:共有会+ヒアリング→次週バックログ化(BNE/T-sort 担当と30分)。
3) 技術スタックと拡張方針の再確認
Phase1はGASで軽快に。ボリュームが増えたらCloud Run(Node/Python)へ移行する二段ロケットでいく(将来のPandas/並列化も視野)。
設計メモ(今日のドラフト)
スキーマ(抜粋)
box_raw_data.ec_returns:
return_date:DATE, sku:STRING, qty:INT64, reason:STRING, order_id:STRING …box_raw_data.tsort_logs:
started_at:TIMESTAMP, line:STRING, status:STRING, error_code:STRING, duration_sec:INT64 …
(明日、実CSVを見て確定・正規化/派生列はLooker計算 or BQビューで追従)
パイプラインの要点
未処理判定:Boxのfile_idを処理済みレジストリ(GAS Properties or 管理シート)に保存、差分だけ読む。
変換:Utilities.parseCsv()で2次元配列→行バルクでTabledata.insertAllへ(低レイテンシ挿入)。
トリガー:GASの時間主導で毎日8–9時枠に実行。失敗時はログ+アラート(Slack連携は任意)。
擬似コード(要約)
function main() {
const svc = getBoxService(); // OAuth2 for Apps Script
const targets = getTargetFolderIds(); // 複数フォルダ
const files = listNewCsvFiles(svc, targets); // 未処理のみ
for (const f of files) {
const text = fetchFileText(svc, f.id);
const rows = Utilities.parseCsv(text);
insertAllToBQ("box_raw_data", pickTable(f), rows);
markProcessed(f.id);
}
logSummary(files.length);
}(Day 3–4で完成させるイメージ。Box OAuth、フォルダ監視、未処理判定、BQストリーミングは仕様書に沿った一本道で組む)
ダッシュボード方針(Day 6に着手)
返品:時系列推移/SKU別/理由別
T-sort:時間帯稼働率/エラーコード構成/拠点別
まずは“1画面で状況が分かる最少構成”を置き、共有会の気づきで磨く。
リスクと手当
CSVフォーマット揺れ:列名/型の差分→シンプレ変換(前処理マッピングテーブル)or BQ側スキーマの許容設計。
GAS上限(実行時間/サイズ):初期はOK。閾値接近でCloud Run移行を前倒し(フェーズ設計済み)。
“人に届かない”問題:Day 7の共有会で使い方レクチャー+“見たい1枚”を聞く。次週の改善バックログに反映。
今日の学び
**「毎朝まわる」の設計が生産性を決める。投入を自動化すると、議論が“解釈”から“意思決定”**に移る。
作り込みより一本の通し。Box→BQ→Lookerが通れば、現場の声で“どこを太らせるか”が見えてくる。
明日の予定(Day 173)
BigQueryデータセット&2テーブルを作成(box_raw_data.ec_returns/tsort_logs)。
**Boxアプリ(OAuth2)**のクライアントID/シークレット発行→GASプロパティ登録。
GASにOAuth2ライブラリ導入→認可フロー通しまで。
#100日チャレンジ #Week11 #Day172 #DX実験室 #BoxAPI #BigQuery #LookerStudio #GoogleAppsScript #データパイプライン
