Day 174|Box認可フロー突破と未処理判定ロジックの雛形づくり
こんにちは、こんです🦊
100日チャレンジ2回目の**Week 11 / Day 3(通算 Day 174)**です。
昨日(Day 173)は、BigQueryのスキーマを確定し、Box OAuthアプリのクライアントID/シークレットを登録しました。今日はその続きを実装し、Box認可フローの突破 → 実フォルダのファイルリスト取得 → 未処理判定の雛形 までを進めました。
🎯 今日のゴール
GASでOAuth2認可フローを通し、アクセストークン/リフレッシュトークン取得
Boxフォルダ内のファイル一覧を取得(名前・ID・更新日を軽量に)
処理済みレジストリを使った「未処理ファイルだけ読む」ロジックの雛形作成
🔧 実装ログ
1) Box OAuth認可フロー
GASのログに出力された認可URLをクリック → Boxログインで承認
コールバック関数 authCallback() が正常に動き、アクセストークン/リフレッシュトークンが保存されることを確認
service.hasAccess() が true を返すようになり、APIコール可能な状態に到達
👉 これで「Boxに正しくつながる」第一関門を突破しました。
2) フォルダリスト取得
function listFilesInFolder(folderId) {
const svc = getBoxService_();
if (!svc.hasAccess()) throw new Error("認証が必要です");
const url = `https://api.box.com/2.0/folders/${folderId}/items?fields=name,id,modified_at`;
const res = UrlFetchApp.fetch(url, {
headers: { Authorization: `Bearer ${svc.getAccessToken()}` }
});
return JSON.parse(res.getContentText()).entries;
}
レスポンスを entries 配列として受け取り、ファイル名・ID・更新日を抽出
実際に returns/ フォルダと tsort/ フォルダを指定して、想定通りのCSVリストが取得できました
3) 未処理判定の雛形
処理済みfile_idをScript Propertiesに記録
listFilesInFolder() で取得したリストと突合し、未処理のものだけ返す仕組み
擬似コード:
function listNewCsvFiles(folderId) {
const processed = JSON.parse(PropertiesService.getScriptProperties().getProperty("PROCESSED_IDS") || "[]");
const files = listFilesInFolder(folderId);
const newFiles = files.filter(f => !processed.includes(f.id) && f.name.endsWith(".csv"));
return newFiles;
}
👉 これで「毎朝、新しいCSVだけを拾う」パターンの基盤が整いました。
💡 学び
Box APIはfields指定が肝:余計なフィールドを省くことでレスポンスが軽くなり、GASの実行時間節約に直結。
未処理判定はfile_id基準が鉄板:ファイル名や日時よりも一意性が高く、重複処理のリスクを最小化できる。
OAuth突破でようやく“動かせる土俵”に立てた感覚:昨日までは机上の設計、今日は初めてデータが動く瞬間に立ち会えた。
🔭 明日の予定(Day 175)
files/{file_id}/content を叩いてCSV本文を取得
Utilities.parseCsv() → BigQuery.Tabledata.insertAll() の一連パイプを実装
最初の「返品CSV → ec_returnsテーブル」ストリーミング挿入テストを成功させる
✍️ まとめ
Day 174は、Box認可フローを突破し、未処理ファイル判定の仕組みを動かす ところまで進めました。これでいよいよ明日は「Box→BQのパイプ」を実際に通す日。
止まらないデータ基盤に向けて、パイプラインの“幹”が少しずつ形になってきました。
#100日チャレンジ #Week11 #Day174 #DX実験室
#BoxDataWeaver #BoxAPI #BigQuery #GoogleAppsScript #データ基盤 #業務改善
