{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "google-sheets-append-row", "type": "registry:item", "description": "Append a row to a Google Sheet", "dependencies": [], "files": [ { "path": "steps/google-sheets-append-row.ts", "content": "/**\n * Append a row to a Google Sheet\n *\n * @param spreadsheetId - The ID of the spreadsheet (from the URL)\n * @param sheetName - The name of the sheet/tab\n * @param values - Array of values to append as a row\n * @returns The updated range and values\n *\n * @env GOOGLE_SHEETS_API_KEY - Google Sheets API key\n */\n\nimport { FatalError } from \"workflow\"\n\ninterface AppendRowOptions {\n spreadsheetId: string\n sheetName: string\n values: string[]\n}\n\nexport async function googleSheetsAppendRow({ spreadsheetId, sheetName, values }: AppendRowOptions) {\n \"use step\"\n\n const apiKey = process.env.GOOGLE_SHEETS_API_KEY\n if (!apiKey) {\n throw new FatalError(\"GOOGLE_SHEETS_API_KEY environment variable is required\")\n }\n\n if (!spreadsheetId || !sheetName || !values?.length) {\n throw new FatalError(\"spreadsheetId, sheetName, and values are required\")\n }\n\n const range = `${sheetName}!A:Z`\n const url = `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/${encodeURIComponent(range)}:append?valueInputOption=USER_ENTERED&key=${apiKey}`\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n values: [values],\n }),\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to append row to Google Sheet: ${error}`)\n }\n\n const data = await response.json()\n return {\n updatedRange: data.updates.updatedRange,\n updatedRows: data.updates.updatedRows,\n }\n}\n", "type": "registry:file", "target": "steps/google-sheets-append-row.ts" } ] }