@robinpath/google-sheets
Advanced tools
| /** | ||
| * RobinPath Google Sheets Module (Node port) | ||
| * | ||
| * Sheets API v4 with **service-account** authentication. The user creates | ||
| * a service account in Google Cloud, downloads its JSON key, and stores | ||
| * the `client_email` + `private_key` fields in a `google_service_account` | ||
| * credential. The module signs a JWT (RS256) with the private key and | ||
| * exchanges it for an OAuth2 access token at every call (cached for ~50min | ||
| * in-process). | ||
| * | ||
| * The user must share each spreadsheet with the service account's email | ||
| * address (treat it as a regular Google Workspace user) for read/write to work. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - google_service_account : { client_email, private_key, scopes? } | ||
| * | ||
| * Mirror of packages/php/google-sheets/src/index.php — shares the same | ||
| * credential contract, metadata shape, and error taxonomy. | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureGoogleSheets(h: ModuleHost): void; | ||
| export declare const GoogleSheetsFunctions: Record<string, BuiltinHandler>; | ||
| export declare const GoogleSheetsCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const GoogleSheetsFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const GoogleSheetsModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=google-sheets.d.ts.map |
| {"version":3,"file":"google-sheets.d.ts","sourceRoot":"","sources":["../src/google-sheets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEzD;AA+WD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAMhE,CAAC;AAIF,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,EAoC7D,CAAC;AA0FF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA0JzE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,cA6BxC,CAAC"} |
| /** | ||
| * RobinPath Google Sheets Module (Node port) | ||
| * | ||
| * Sheets API v4 with **service-account** authentication. The user creates | ||
| * a service account in Google Cloud, downloads its JSON key, and stores | ||
| * the `client_email` + `private_key` fields in a `google_service_account` | ||
| * credential. The module signs a JWT (RS256) with the private key and | ||
| * exchanges it for an OAuth2 access token at every call (cached for ~50min | ||
| * in-process). | ||
| * | ||
| * The user must share each spreadsheet with the service account's email | ||
| * address (treat it as a regular Google Workspace user) for read/write to work. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - google_service_account : { client_email, private_key, scopes? } | ||
| * | ||
| * Mirror of packages/php/google-sheets/src/index.php — shares the same | ||
| * credential contract, metadata shape, and error taxonomy. | ||
| */ | ||
| import { createSign } from "node:crypto"; | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Google Sheets module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureGoogleSheets(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const TOKEN_URL = "https://oauth2.googleapis.com/token"; | ||
| const SHEETS_API = "https://sheets.googleapis.com/v4/spreadsheets/"; | ||
| const DEFAULT_SCOPE = "https://www.googleapis.com/auth/spreadsheets"; | ||
| const TOKEN_TTL_MS = 3000 * 1000; // 50 minutes; tokens last 60min, leave a buffer. | ||
| const CREDENTIAL_TYPE = "google_service_account"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return typeof v === "object" && v !== null && "error" in v && "code" in v; | ||
| } | ||
| const tokenCache = new Map(); | ||
| // ── JWT / token helpers ──────────────────────────────────────────────── | ||
| function b64url(data) { | ||
| const buf = typeof data === "string" ? Buffer.from(data, "utf8") : data; | ||
| return buf | ||
| .toString("base64") | ||
| .replace(/\+/g, "-") | ||
| .replace(/\//g, "_") | ||
| .replace(/=+$/, ""); | ||
| } | ||
| function buildJwt(email, privateKey, scope) { | ||
| const now = Math.floor(Date.now() / 1000); | ||
| const header = { alg: "RS256", typ: "JWT" }; | ||
| const payload = { | ||
| iss: email, | ||
| scope, | ||
| aud: TOKEN_URL, | ||
| exp: now + 3600, | ||
| iat: now, | ||
| }; | ||
| const h = b64url(JSON.stringify(header)); | ||
| const p = b64url(JSON.stringify(payload)); | ||
| const signingInput = `${h}.${p}`; | ||
| try { | ||
| const signer = createSign("RSA-SHA256"); | ||
| signer.update(signingInput); | ||
| signer.end(); | ||
| const signature = signer.sign(privateKey); | ||
| return `${signingInput}.${b64url(signature)}`; | ||
| } | ||
| catch (e) { | ||
| const msg = e instanceof Error ? e.message : String(e); | ||
| if (/pem|private|parse|asymmetric|decode/i.test(msg)) { | ||
| return errorReturn("Could not parse private key (is it PEM?).", "jwt_sign_failed"); | ||
| } | ||
| return errorReturn(`openssl_sign failed: ${msg}`, "jwt_sign_failed"); | ||
| } | ||
| } | ||
| async function getAccessToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const email = String(fields.client_email ?? ""); | ||
| const key = String(fields.private_key ?? ""); | ||
| const scope = String(fields.scopes ?? "") || DEFAULT_SCOPE; | ||
| if (!email || !key) { | ||
| return errorReturn("Credential is missing `client_email` or `private_key`.", "private_key_missing"); | ||
| } | ||
| // Cache by email + scope to keep multi-credential setups isolated. | ||
| const cacheKey = `${email}|${scope}`; | ||
| const cached = tokenCache.get(cacheKey); | ||
| if (cached && cached.expiresAt > Date.now()) { | ||
| return cached.token; | ||
| } | ||
| const jwt = buildJwt(email, key, scope); | ||
| if (typeof jwt !== "string") | ||
| return jwt; // error envelope | ||
| // Exchange JWT for access token. | ||
| let response; | ||
| try { | ||
| response = await fetch(TOKEN_URL, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/x-www-form-urlencoded" }, | ||
| body: new URLSearchParams({ | ||
| grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", | ||
| assertion: jwt, | ||
| }).toString(), | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded = null; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| const accessToken = decoded && typeof decoded.access_token === "string" | ||
| ? decoded.access_token | ||
| : ""; | ||
| if (response.status < 200 || response.status >= 300 || !accessToken) { | ||
| let message = "Token exchange failed."; | ||
| if (decoded) { | ||
| if (typeof decoded.error_description === "string") { | ||
| message = decoded.error_description; | ||
| } | ||
| else if (typeof decoded.error === "string") { | ||
| message = decoded.error; | ||
| } | ||
| } | ||
| return errorReturn(message, "token_exchange_failed", { | ||
| status: response.status, | ||
| }); | ||
| } | ||
| tokenCache.set(cacheKey, { | ||
| token: accessToken, | ||
| expiresAt: Date.now() + TOKEN_TTL_MS, | ||
| }); | ||
| return accessToken; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function call(cred, method, path, body) { | ||
| const token = await getAccessToken(cred); | ||
| if (typeof token !== "string") | ||
| return token; | ||
| const init = { | ||
| method, | ||
| headers: { | ||
| Authorization: `Bearer ${token}`, | ||
| "Content-Type": "application/json", | ||
| }, | ||
| }; | ||
| if (body !== null && body !== undefined) { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(`${SHEETS_API}${path}`, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw }; | ||
| } | ||
| if (status >= 200 && status < 300) { | ||
| return decoded && typeof decoded === "object" ? decoded : { raw }; | ||
| } | ||
| const errObj = decoded && typeof decoded === "object" && "error" in decoded | ||
| ? decoded.error | ||
| : {}; | ||
| let message = `Sheets API returned HTTP ${status}.`; | ||
| if (errObj && typeof errObj === "object" && "message" in errObj) { | ||
| message = String(errObj.message); | ||
| } | ||
| let code = "sheets_error"; | ||
| if (status === 429) | ||
| code = "rate_limited"; | ||
| else if (status === 403 || status === 401) | ||
| code = "permission_denied"; | ||
| return errorReturn(message, code, { | ||
| status, | ||
| sheets_error: decoded && typeof decoded === "object" ? decoded : { raw }, | ||
| }); | ||
| } | ||
| // ── Query helpers ────────────────────────────────────────────────────── | ||
| function buildQuery(params) { | ||
| const qs = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(params)) { | ||
| if (v !== null && v !== undefined && v !== "") | ||
| qs.set(k, v); | ||
| } | ||
| const s = qs.toString(); | ||
| return s ? `?${s}` : ""; | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const readRange = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sid = String(args[1] ?? ""); | ||
| const range = String(args[2] ?? ""); | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (!sid || !range) { | ||
| return { error: "spreadsheetId and range are required." }; | ||
| } | ||
| const query = buildQuery({ | ||
| valueRenderOption: opts.valueRenderOption !== undefined ? String(opts.valueRenderOption) : null, | ||
| dateTimeRenderOption: opts.dateTimeRenderOption !== undefined ? String(opts.dateTimeRenderOption) : null, | ||
| majorDimension: opts.majorDimension !== undefined ? String(opts.majorDimension) : null, | ||
| }); | ||
| const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}${query}`; | ||
| return (await call(cred, "GET", path, null)); | ||
| }; | ||
| const writeRange = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sid = String(args[1] ?? ""); | ||
| const range = String(args[2] ?? ""); | ||
| const values = Array.isArray(args[3]) ? args[3] : []; | ||
| const opts = (args[4] && typeof args[4] === "object" ? args[4] : {}); | ||
| if (!sid || !range) { | ||
| return { error: "spreadsheetId and range are required." }; | ||
| } | ||
| const query = buildQuery({ | ||
| valueInputOption: String(opts.valueInputOption ?? "USER_ENTERED"), | ||
| includeValuesInResponse: opts.includeValuesInResponse !== undefined | ||
| ? opts.includeValuesInResponse | ||
| ? "true" | ||
| : "false" | ||
| : null, | ||
| }); | ||
| const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}${query}`; | ||
| return (await call(cred, "PUT", path, { range, values })); | ||
| }; | ||
| const appendRows = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sid = String(args[1] ?? ""); | ||
| const range = String(args[2] ?? ""); | ||
| const values = Array.isArray(args[3]) ? args[3] : []; | ||
| const opts = (args[4] && typeof args[4] === "object" ? args[4] : {}); | ||
| if (!sid || !range) { | ||
| return { error: "spreadsheetId and range are required." }; | ||
| } | ||
| const query = buildQuery({ | ||
| valueInputOption: String(opts.valueInputOption ?? "USER_ENTERED"), | ||
| insertDataOption: String(opts.insertDataOption ?? "INSERT_ROWS"), | ||
| includeValuesInResponse: opts.includeValuesInResponse !== undefined | ||
| ? opts.includeValuesInResponse | ||
| ? "true" | ||
| : "false" | ||
| : null, | ||
| }); | ||
| const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}:append${query}`; | ||
| return (await call(cred, "POST", path, { values })); | ||
| }; | ||
| const clearRange = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sid = String(args[1] ?? ""); | ||
| const range = String(args[2] ?? ""); | ||
| if (!sid || !range) { | ||
| return { error: "spreadsheetId and range are required." }; | ||
| } | ||
| const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}:clear`; | ||
| return (await call(cred, "POST", path, {})); | ||
| }; | ||
| const listSheets = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sid = String(args[1] ?? ""); | ||
| if (!sid) | ||
| return { error: "spreadsheetId is required." }; | ||
| const fields = "sheets(properties(sheetId,title,index,gridProperties))"; | ||
| const path = `${encodeURIComponent(sid)}?fields=${encodeURIComponent(fields)}`; | ||
| const result = await call(cred, "GET", path, null); | ||
| if (isErrorReturn(result)) | ||
| return result; | ||
| const sheets = result && typeof result === "object" && Array.isArray(result.sheets) | ||
| ? result.sheets | ||
| : []; | ||
| return sheets.map((s) => s && typeof s === "object" && s.properties && typeof s.properties === "object" | ||
| ? s.properties | ||
| : {}); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const GoogleSheetsFunctions = { | ||
| readRange, | ||
| writeRange, | ||
| appendRows, | ||
| clearRange, | ||
| listSheets, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const GoogleSheetsCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Google Service Account", | ||
| icon: "key-square", | ||
| fields: [ | ||
| { | ||
| name: "client_email", | ||
| title: "Service account email", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "name@project-id.iam.gserviceaccount.com", | ||
| description: "The `client_email` field from your service-account JSON key. Share each spreadsheet with this address.", | ||
| pattern: "@[a-z0-9-]+\\.iam\\.gserviceaccount\\.com$", | ||
| }, | ||
| { | ||
| name: "private_key", | ||
| title: "Private key (PEM)", | ||
| type: "textarea", | ||
| required: true, | ||
| placeholder: "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----\n", | ||
| description: "The `private_key` field from your service-account JSON. Paste it as-is, including the BEGIN/END lines.", | ||
| }, | ||
| { | ||
| name: "scopes", | ||
| title: "Scopes", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "https://www.googleapis.com/auth/spreadsheets", | ||
| description: "Space-separated OAuth scopes. Defaults to the full Sheets scope.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Exports: metadata ────────────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `google_service_account` credential.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_google_sa", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const spreadsheetIdParam = { | ||
| name: "spreadsheetId", | ||
| title: "Spreadsheet ID", | ||
| description: "The long ID from the spreadsheet URL: `docs.google.com/spreadsheets/d/{ID}/edit`. Must be shared with the service account.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "1AbC2dE…", | ||
| }; | ||
| const rangeParam = { | ||
| name: "range", | ||
| title: "Range (A1 notation)", | ||
| description: "A1-notation range with optional sheet name. Examples:\n Sheet1!A1:B10\n Sheet1!A:C (entire columns)\n Submissions (the whole sheet)", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "Sheet1!A1:C", | ||
| }; | ||
| const valuesParam = { | ||
| name: "values", | ||
| title: "Values", | ||
| description: "Two-dimensional array of row arrays: `[[a,b,c], [d,e,f]]`.", | ||
| dataType: "array", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| placeholder: '[\n ["Name", "Email"],\n ["Ada", "ada@example.com"]\n]', | ||
| }; | ||
| const writeOptionsParam = { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n valueInputOption : 'USER_ENTERED' (default — formulas evaluated, dates parsed) | 'RAW' (literal strings)\n includeValuesInResponse : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| private_key_missing: "The credential is missing `client_email` or `private_key`.", | ||
| jwt_sign_failed: "Could not sign the JWT — `private_key` is malformed (must be PEM).", | ||
| token_exchange_failed: "Google rejected the JWT — check the service account email + private key match.", | ||
| transport: "Network failure calling Google API.", | ||
| sheets_error: "Sheets API returned an error — see `sheets_error.error`.", | ||
| permission_denied: "Service account does not have access — share the spreadsheet with the credential's email.", | ||
| rate_limited: "Sheets API rate limit (~60 reads/min/user, 60 writes/min/user).", | ||
| }; | ||
| export const GoogleSheetsFunctionMetadata = { | ||
| readRange: { | ||
| title: "Read range", | ||
| summary: "Read values from a range", | ||
| description: "Calls `GET /v4/spreadsheets/{id}/values/{range}`. Returns the raw values 2D array.", | ||
| group: "values", | ||
| action: "read", | ||
| icon: "eye", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["sheets", "read", "values"], | ||
| parameters: [ | ||
| credentialParam, | ||
| spreadsheetIdParam, | ||
| rangeParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n valueRenderOption : 'FORMATTED_VALUE' (default) | 'UNFORMATTED_VALUE' | 'FORMULA'\n dateTimeRenderOption : 'SERIAL_NUMBER' | 'FORMATTED_STRING' (default)\n majorDimension : 'ROWS' (default) | 'COLUMNS'", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ range, majorDimension, values: [[…], …] }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Read first 100 rows", | ||
| code: 'google-sheets.readRange "my_google_sa" "1AbC..." "Submissions!A1:E100"', | ||
| }, | ||
| ], | ||
| example: 'google-sheets.readRange "my_google_sa" "1AbC..." "Sheet1!A1:C10"', | ||
| }, | ||
| writeRange: { | ||
| title: "Write range", | ||
| summary: "Overwrite values in a range", | ||
| description: "Calls `PUT /v4/spreadsheets/{id}/values/{range}`. Replaces existing values; sized to the supplied 2D array.", | ||
| group: "values", | ||
| action: "write", | ||
| icon: "pencil", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["sheets", "write", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| spreadsheetIdParam, | ||
| rangeParam, | ||
| valuesParam, | ||
| writeOptionsParam, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ spreadsheetId, updatedRange, updatedRows, updatedColumns, updatedCells }", | ||
| errors: commonErrors, | ||
| example: 'google-sheets.writeRange "my_google_sa" "1AbC..." "Sheet1!A1" [["x","y"]]', | ||
| }, | ||
| appendRows: { | ||
| title: "Append rows", | ||
| summary: "Append rows to the bottom of a range", | ||
| description: "Calls `POST /v4/spreadsheets/{id}/values/{range}:append`. Finds the first empty row in the range and inserts there. Ideal for log-style sheets.", | ||
| group: "values", | ||
| action: "write", | ||
| icon: "plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["sheets", "append", "log"], | ||
| parameters: [ | ||
| credentialParam, | ||
| spreadsheetIdParam, | ||
| rangeParam, | ||
| valuesParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n valueInputOption : 'USER_ENTERED' (default) | 'RAW'\n insertDataOption : 'INSERT_ROWS' (default — push existing data down) | 'OVERWRITE'\n includeValuesInResponse: bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ spreadsheetId, tableRange, updates: { … } }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Log a form submission", | ||
| code: 'google-sheets.appendRows "my_google_sa" "1AbC..." "Submissions!A:D" [[\n {{ now }}, {{ form.email }}, {{ form.name }}, {{ form.plan }}\n]]', | ||
| }, | ||
| ], | ||
| example: 'google-sheets.appendRows "my_google_sa" "1AbC..." "A:C" [["a","b","c"]]', | ||
| }, | ||
| clearRange: { | ||
| title: "Clear range", | ||
| summary: "Empty all cells in a range (formatting preserved)", | ||
| description: "Calls `POST /v4/spreadsheets/{id}/values/{range}:clear`.", | ||
| group: "values", | ||
| action: "delete", | ||
| icon: "eraser", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["sheets", "clear", "delete"], | ||
| parameters: [credentialParam, spreadsheetIdParam, rangeParam], | ||
| returnType: "object", | ||
| errors: commonErrors, | ||
| example: 'google-sheets.clearRange "my_google_sa" "1AbC..." "Sheet1!A2:Z"', | ||
| }, | ||
| listSheets: { | ||
| title: "List sheets in spreadsheet", | ||
| summary: "List all sheet tabs and their metadata", | ||
| description: "Calls `GET /v4/spreadsheets/{id}` with a fields mask. Returns each sheet's `{sheetId, title, index, gridProperties: {rowCount, columnCount}}`.", | ||
| group: "meta", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["sheets", "metadata", "tabs"], | ||
| parameters: [credentialParam, spreadsheetIdParam], | ||
| returnType: "array", | ||
| returnDescription: "Array of sheet property objects.", | ||
| errors: commonErrors, | ||
| example: 'google-sheets.listSheets "my_google_sa" "1AbC..."', | ||
| }, | ||
| }; | ||
| export const GoogleSheetsModuleMetadata = { | ||
| slug: "google-sheets", | ||
| title: "Google Sheets", | ||
| summary: "Read, write, append, and clear ranges in Google Sheets — service-account auth (no user OAuth needed)", | ||
| description: "Read and write spreadsheets directly. Lead capture into a sheet, sync inventory, build dashboards from sheet data.\n\nAuthentication uses a service account — create one at console.cloud.google.com, download the JSON key, and paste `client_email` + `private_key` into a `google_service_account` credential. Then **share each spreadsheet with the service account's email** (Editor for write, Viewer for read).", | ||
| category: "productivity", | ||
| icon: "icon.svg", | ||
| color: "#0F9D58", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/google-sheets", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| values: { | ||
| title: "Values", | ||
| description: "Range read/write/append/clear.", | ||
| order: 1, | ||
| }, | ||
| meta: { | ||
| title: "Metadata", | ||
| description: "Sheet/spreadsheet introspection.", | ||
| order: 2, | ||
| }, | ||
| }, | ||
| methods: Object.keys(GoogleSheetsFunctions), | ||
| }; | ||
| //# sourceMappingURL=google-sheets.js.map |
| {"version":3,"file":"google-sheets.js","sourceRoot":"","sources":["../src/google-sheets.ts"],"names":[],"mappings":"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"} |
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const GoogleSheetsModule: ModuleAdapter; | ||
| export default GoogleSheetsModule; | ||
| export { GoogleSheetsModule }; | ||
| export { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, } from "./google-sheets.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,kBAAkB,EAAE,aAQzB,CAAC;AAEF,eAAe,kBAAkB,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"} |
| import { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, configureGoogleSheets, } from "./google-sheets.js"; | ||
| const GoogleSheetsModule = { | ||
| name: "google-sheets", | ||
| functions: GoogleSheetsFunctions, | ||
| functionMetadata: GoogleSheetsFunctionMetadata, | ||
| moduleMetadata: GoogleSheetsModuleMetadata, | ||
| credentialTypes: GoogleSheetsCredentialTypes, | ||
| configure: configureGoogleSheets, | ||
| global: false, | ||
| }; | ||
| export default GoogleSheetsModule; | ||
| export { GoogleSheetsModule }; | ||
| export { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, } from "./google-sheets.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,kBAAkB,GAAkB;IACxC,IAAI,EAAE,eAAe;IACrB,SAAS,EAAE,qBAAqB;IAChC,gBAAgB,EAAE,4BAA4B;IAC9C,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,2BAA2B;IAC5C,SAAS,EAAE,qBAAqB;IAChC,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,kBAAkB,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"} |
+20
-8
| { | ||
| "name": "@robinpath/google-sheets", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,18 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Google Sheets module for RobinPath.", | ||
| "description": "Google Sheets integration — read, write, append, clear ranges and list sheet metadata. Service-account authentication using a JWT exchange (no user OAuth dance).", | ||
| "keywords": [ | ||
| "googlesheets", | ||
| "productivity" | ||
| "productivity", | ||
| "google", | ||
| "sheets", | ||
| "spreadsheet", | ||
| "google-sheets", | ||
| "service-account", | ||
| "data" | ||
| ], | ||
@@ -38,6 +44,12 @@ "license": "MIT", | ||
| "category": "productivity", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 10 | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 10, | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/google-sheets | ||
| ```bash | ||
| npm install @robinpath/google-sheets | ||
| robinpath add @robinpath/google-sheets | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
49830
1088.41%10
400%631
Infinity%2
100%3
50%