Google Docs tabs are great for organizing large documents, but there's no built-in way to export each tab as a separate PDF. Here's how to automate this using the Google Docs API and Google Drive API
Setup
You'll need a Google Cloud project with the Docs API and Drive API enabled, plus a service account with a JSON key. Share your Google Doc with the service account email. You could also use OAuth with user credentials.
The Code
import { google } from "googleapis"; import fs from "fs"; import path from "path"; import { Readable } from "stream"; const FILE_ID = "YOUR_DOCUMENT_ID"; const OUT_DIR = "exports"; async function main() { const auth = new google.auth.GoogleAuth({ credentials: { client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL, private_key: process.env.GOOGLE_PRIVATE_KEY .replace(/\\n/g, "\n"), }, scopes: [ "https://www.googleapis.com/auth/drive.readonly", "https://www.googleapis.com/auth/documents.readonly", ], }); const docs = google.docs({ version: "v1", auth }); const { token } = await auth.getAccessToken(); const res = await docs.documents.get({ documentId: FILE_ID, includeTabsContent: true, }); for (const tab of res.data.tabs) { const { title, tabId } = tab.tabProperties; const name = `${title.replace(/ /g, "-")}.pdf`; const dest = path.join(OUT_DIR, name); const url = `https://docs.google.com/document/d/` + `${FILE_ID}/export?format=pdf&tab=${tabId}`; const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` }, }); if (!response.ok || !response.body) { throw new Error(`Failed to download "${name}"`); } await new Promise((resolve, reject) => { Readable.fromWeb(response.body) .pipe(fs.createWriteStream(dest)) .on("finish", resolve) .on("error", reject); }); console.log(`Downloaded ${name}`); } } main(); How It Works
Two key pieces make this work:
includeTabsContent: true- When callingdocs.documents.get, this parameter populates thetabsarray with metadata for each tab, including thetabId.Undocumented
tabURL parameter - The export URL patternhttps://docs.google.com/document/d/{FILE_ID}/export?format=pdf&tab={tabId}allows exporting individual tabs. The officialfiles.exportAPI doesn't support per-tab exports (issue tracker). Since this is undocumented, it could change.
Top comments (0)