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返品CSVT-sort 稼働CSV。Box上の保管場所と列項目を棚卸し。これをBigQueryの2テーブル(ec_returns / tsort_logs)に受ける前提でスキーマ策定。

  • 成功の条件:

    1. BoxにCSVを置くと翌朝までにBQへ反映

    2. Lookerのダッシュボードが常時最新

    3. 手動オペ0(トリガー運転+処理ログ)

2) Week設計(7日プラン)

  • Day 1–2:要件整理/GCPプロジェクトとBQスキーマ(box_raw_data データセット)作成、Box OAuth準備

  • Day 3–4:GASでBox接続→CSV取得→BQ挿入のパイプ実装(未処理判定・ログ含む)。

  • Day 5:全体結合&時間トリガー設定(毎朝)。

  • Day 6Looker 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 #データパイプライン

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