~~~ Wordでダウンロードするときに、タブ別のファイルとしてZIP一括取得 ~~~
複数タブ構成のGoogleドキュメントを、タブ単位で個別ファイル化し、DriveからZIPで一括取得するための実務メモです。
1. はじめに / 概要
業務で複数タブ構成のGoogleドキュメントを扱っていると、
- Wordで「すべてのタブ」を出力すると1ファイルに統合される
- 「カレントタブ」で出力すると、タブの数だけ作業が必要
- タブ単位で個別の形で一括保存する標準機能がない
という課題があります。
タブが多い資料ほど手作業は現実的でなくなるため、
タブ → 個別Doc生成 → フォルダ格納 → ZIP取得という外だし構成を組みました。
2. 全体像・仕組み
設計方針
- Drive表示順を固定するため番号付与
- 階層タブも順序維持(01-01形式)
- コピー失敗でも止めない構成
- Word出力はDrive側に外だし
3. 構築手順・最小構成
前提
- Google Apps Script利用可能
- タブ対応Googleドキュメント
- 保存先フォルダID取得済み
「タブ単位で個別Doc生成」までをゴールにします。
ZIP化はDrive標準機能を使います。
5. 注意点・運用上の工夫
- GoogleからWordのレイアウト完全再現は保証しない
- Word出力はDrive側で実施
- 保存先フォルダ構成を先に決める
完全自動ZIP生成まで一気にやらない方が安定します。
タグ
#GAS
#GoogleDocs
#業務効率化
#自動化
補足:コード
① フォルダID設定
const OUTPUT_FOLDER_ID = "フォルダIDのみ";
② タブ取得確認用
function checkTabsApi() {
const doc = DocumentApp.getActiveDocument();
const tabs = doc.getTabs();
Logger.log("Top tabs: " + tabs.length);
tabs.forEach((t, i) => Logger.log(i + ": " + t.getTitle()));
}
③ メイン処理
function splitTabsToDocs() {
const srcDoc = DocumentApp.getActiveDocument();
const outFolder = DriveApp.getFolderById(OUTPUT_FOLDER_ID);
const items = flattenTabsWithOrder_(srcDoc);
for (const item of items) {
const tab = item.tab;
if (typeof tab.asDocumentTab !== "function") continue;
let docTab;
try {
docTab = tab.asDocumentTab();
} catch (e) {
continue;
}
const fileName = sanitizeName_(item.order + "_" + item.path);
const newDoc = DocumentApp.create(fileName);
const newBody = newDoc.getBody();
newBody.clear();
const srcBody = docTab.getBody();
const n = srcBody.getNumChildren();
for (let i = 0; i < n; i++) {
const child = srcBody.getChild(i).copy();
safeAppend_(newBody, child);
}
newDoc.saveAndClose();
const f = DriveApp.getFileById(newDoc.getId());
outFolder.addFile(f);
}
}