> ## Documentation Index
> Fetch the complete documentation index at: https://botpress-ak-docs-20-document-updating-variables-from-outsid.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Sheets

> Add a bot to Google Sheets using the official integration.

export const OpenInHub = ({integration}) => {
  const {version, id} = integration || ({});
  const basePath = 'https://studio.botpress.cloud/home?exploreHub=1&hubItemId=';
  const url = `${basePath}${id}`;
  return <>
            <a className="button rounded-xl" href={url}>
                <span>
                Open in Hub
                </span>
            </a>
            <i style={{
    margin: "0",
    fontStyle: "normal",
    color: "#666",
    fontSize: "0.85rem",
    padding: '.5rem'
  }}>
                v{version}
            </i>
        </>;
};

export const integrationVersions = {
  "accelo": {
    "version": "2.0.0",
    "id": "intver_01JFAQHPVKP4XTKMNXC2RZKZ88"
  },
  "activecampaign": {
    "version": "2.0.0",
    "id": "intver_01JFAQHVA0Z25PFC7H13EQ41FR"
  },
  "acumatica": {
    "version": "2.0.0",
    "id": "intver_01JFAQHZTNGNHPPS9CKD35Q6EY"
  },
  "airtable": {
    "version": "1.0.1",
    "id": "intver_01K9SVDSQMTXJMY4M8YCV5P5M1"
  },
  "alchemer": {
    "version": "2.0.0",
    "id": "intver_01JFAQQZRS9ZQ7WBWHCF1MKGCM"
  },
  "anthropic": {
    "version": "12.0.1",
    "id": "intver_01K9SVE54HWYN9RMC26G05J3WX"
  },
  "anydesk": {
    "version": "2.0.0",
    "id": "intver_01JFAQR4048H4976FCKT2YHD2X"
  },
  "apollo": {
    "version": "3.0.2",
    "id": "intver_01K6BJFKR5WZV44VNENAN6XBT1"
  },
  "asana": {
    "version": "0.3.10",
    "id": "intver_01KEYXKM7BZ7DDF9QJDQDE8H46"
  },
  "attio": {
    "version": "1.0.0",
    "id": "intver_01K6DMEM4B00RRDYF1KPRK3T1N"
  },
  "avoma": {
    "version": "2.0.0",
    "id": "intver_01JFAQRC955G4CXN8QTFHXAPXZ"
  },
  "bamboohr": {
    "version": "2.0.3",
    "id": "intver_01KESBCSC0N9WGPHNM1W1R08VK"
  },
  "beehiiv": {
    "version": "2.0.0",
    "id": "intver_01JFAQRGRRB95YC5YKWB1BFHZH"
  },
  "bigcommerce": {
    "version": "3.2.0",
    "id": "intver_01K3KNZ6CCCZ8E95G5ZGF5QV2J"
  },
  "bigin": {
    "version": "2.0.0",
    "id": "intver_01JFAQRS4Q0AY8CEAGYTDMPEPV"
  },
  "bolt": {
    "version": "2.0.0",
    "id": "intver_01JFAQRXGEVSFY1PYM195NAWQ6"
  },
  "box": {
    "version": "2.0.0",
    "id": "intver_01JFAQS1NBSGECDYX5MTTFN7RK"
  },
  "braze": {
    "version": "2.0.0",
    "id": "intver_01JFAQS5V6T5HF7MRJ46NMP42B"
  },
  "brevo": {
    "version": "2.0.0",
    "id": "intver_01JFAQSA1R5F1JGJZS55VTC1RP"
  },
  "britive": {
    "version": "2.0.0",
    "id": "intver_01JFAQSE7EMRGQE8EQD2CB6AZR"
  },
  "browser": {
    "version": "0.8.3",
    "id": "intver_01KCPVZG26185R8HFXCMEWBQZR"
  },
  "bynder": {
    "version": "2.0.0",
    "id": "intver_01JFAQSJT5N0Q2J2K7KGG12QQ5"
  },
  "calcom": {
    "version": "0.4.0",
    "id": "intver_01K3RNX07M9B21NA3PWJQ4D14H"
  },
  "calendly": {
    "version": "0.0.1",
    "id": "intver_01K4QXYC4K6PAHQ7J1AGHH1682"
  },
  "canny": {
    "version": "0.2.0",
    "id": "intver_01K5VH8AR6CKTRDRSVP99WDJN7"
  },
  "capsule-crm": {
    "version": "2.0.0",
    "id": "intver_01JFAQSQ6CJJ6G9FK7PAACKE6X"
  },
  "cerebras": {
    "version": "8.0.1",
    "id": "intver_01K9TCHXCG6K7RFRSJSQ3T2Q2P"
  },
  "charts": {
    "version": "0.2.6",
    "id": "intver_01KEYXM4W8FFZNQR97641ZGYYX"
  },
  "chat": {
    "version": "0.7.4",
    "id": "intver_01KBFTKJ7841MVQTYFRT623SP5"
  },
  "checkout": {
    "version": "2.0.0",
    "id": "intver_01JFAQSVA80GG51V7QKTARFG0E"
  },
  "clari": {
    "version": "2.0.0",
    "id": "intver_01JFAQSZVXNWXV8371M8ACEPFV"
  },
  "clay": {
    "version": "2.0.0",
    "id": "intver_01JFAQT424E25GR5K1Q8PZC4SC"
  },
  "clickup": {
    "version": "0.0.1",
    "id": "intver_01JEEWCGZ9QPQCBWVE95CMZ5PS"
  },
  "close": {
    "version": "2.0.0",
    "id": "intver_01JFAQT8BMZG66DNJM1DBZ2EQ3"
  },
  "cognism": {
    "version": "2.0.0",
    "id": "intver_01JFAQTCC9XR5N28RA4SNZ8KYJ"
  },
  "comeet": {
    "version": "2.0.0",
    "id": "intver_01JFAQTGMDYR086FC0VEQ95VGC"
  },
  "confluence": {
    "version": "3.3.2",
    "id": "intver_01JZAY7V5PMF8HX7FDMM9JZTQX"
  },
  "copper": {
    "version": "2.0.0",
    "id": "intver_01JFAQTS5YQTVNMSRMTH12X4YC"
  },
  "creatio": {
    "version": "2.0.0",
    "id": "intver_01JFAQTXY9Z4S1XDWSBT4J4KJJ"
  },
  "crmone": {
    "version": "2.0.0",
    "id": "intver_01JFAQV28DCXF7SV71N9Q5BJC8"
  },
  "dalle": {
    "version": "0.3.5",
    "id": "intver_01KA00BFXTW8APN0A0T8C023F1"
  },
  "databricks": {
    "version": "0.0.4",
    "id": "intver_01JBMK24H270H1ZTH2E8P34V4J"
  },
  "demandbase": {
    "version": "2.0.0",
    "id": "intver_01JFAQV9ZZ9MHH2ENEQ1ERMY2G"
  },
  "discord": {
    "version": "0.3.2",
    "id": "intver_01J3E7AN39P65XZ0Z00C1ZAHJ9"
  },
  "docusign": {
    "version": "2.0.0",
    "id": "intver_01JFAQVKFW4F7BBRSDD7EEZE6Z"
  },
  "dropbox": {
    "version": "1.2.0",
    "id": "intver_01JV5ED268ZJ8WQGVCKJZT2QPW"
  },
  "email": {
    "version": "0.1.0",
    "id": "intver_01K22SS8XNF58PQS42G1GGTK58"
  },
  "enchant": {
    "version": "2.0.0",
    "id": "intver_01JFAQVQQ60DZV01V3D1GA29YG"
  },
  "engagebay": {
    "version": "2.0.0",
    "id": "intver_01JFAQVVW42J4KNWCEZ6VQ3ZSJ"
  },
  "fathom": {
    "version": "2.0.0",
    "id": "intver_01JFAQW0QPEJS7M4EPVN9GJJDK"
  },
  "feature-base": {
    "version": "1.0.0",
    "id": "intver_01K5CVJXDNHM9K8NY3G2HWK5ZP"
  },
  "fireworks-ai": {
    "version": "10.0.1",
    "id": "intver_01KA00C056YZ050NMGZ91RMK95"
  },
  "fivetran": {
    "version": "2.0.0",
    "id": "intver_01JFAQW55482FWTDSPCYT53DWE"
  },
  "flodesk": {
    "version": "2.0.0",
    "id": "intver_01JFAQW9APE7Z8E81T2F58VDM7"
  },
  "folk": {
    "version": "2.0.0",
    "id": "intver_01JFAQWDVG2DVFYKJRD8DMHVPZ"
  },
  "freshchat": {
    "version": "1.5.3",
    "id": "intver_01KBFTM9H8CW7B7AV6W7K02CZW"
  },
  "freshsales": {
    "version": "2.0.0",
    "id": "intver_01JFAQWJ3CC3DJ5KG0W6XP33FD"
  },
  "fullstory": {
    "version": "2.0.0",
    "id": "intver_01JFAQWPM0T9EH5SAGDQ3Z14ZC"
  },
  "gainsight": {
    "version": "2.0.0",
    "id": "intver_01JFAQWTPKB13Y7619A6GEN5HQ"
  },
  "getaccept": {
    "version": "2.0.0",
    "id": "intver_01JFAQWZ0SAMDJVQNNA86RG21M"
  },
  "getresponse": {
    "version": "2.0.0",
    "id": "intver_01JFAQX34P2PBW0EM9NC6ZGFT5"
  },
  "github": {
    "version": "1.1.6",
    "id": "intver_01KB60MMABAE5CB0MWN2DY6RKK"
  },
  "gladly": {
    "version": "2.0.0",
    "id": "intver_01JFAQX7B29WE85VA8N5BCST16"
  },
  "gmail": {
    "version": "1.0.4",
    "id": "intver_01KF3MA6855SMVM708B30XRM4S"
  },
  "google-ai": {
    "version": "6.0.4",
    "id": "intver_01KA00CCZVWJQDB5SJ2MSJ4YEW"
  },
  "googlecalendar": {
    "version": "2.0.6",
    "id": "intver_01KCPW0RPJR7X6ATK55RP460VZ"
  },
  "googledrive": {
    "version": "0.3.4",
    "id": "intver_01K6Y3PR2TP9BQEX5PHBGEQD2H"
  },
  "groq": {
    "version": "15.0.1",
    "id": "intver_01KA00CS53WFYF70K16AEZFZXW"
  },
  "gsheets": {
    "version": "2.1.0",
    "id": "intver_01KF14JG57MFAZCXX1CS2T07FQ"
  },
  "gusto": {
    "version": "2.0.0",
    "id": "intver_01JFAR75Y17N5EWS6P0PC93RHQ"
  },
  "happyfox": {
    "version": "2.0.0",
    "id": "intver_01JFAQXFNYWCXX819GTBHJ470W"
  },
  "help-scout": {
    "version": "2.0.0",
    "id": "intver_01JFAQXKX61YWJMMHYK3YDFZ0K"
  },
  "hitl": {
    "version": "2.0.2",
    "id": "intver_01K0SV5HZAT9FSVVEB7S91SH4F"
  },
  "honeybook": {
    "version": "2.0.0",
    "id": "intver_01JFAQXRQ8TADY78EBPBKSXFPC"
  },
  "hubspot": {
    "version": "5.2.0",
    "id": "intver_01KA00D4PND97KRHJ2X9BDY2P7"
  },
  "hunter": {
    "version": "1.0.0",
    "id": "intver_01KA00DFT6W3K8DBR02GMAM99R"
  },
  "instagram": {
    "version": "4.1.6",
    "id": "intver_01KCVJSGRJYRNDX1QTE5TA2J0E"
  },
  "instantly": {
    "version": "2.0.0",
    "id": "intver_01JFAQXWNN3ZM0DAQBE7N2BP54"
  },
  "intercom": {
    "version": "2.0.2",
    "id": "intver_01KD3DHMS7HN4N4DAF7SBVWP5T"
  },
  "keap": {
    "version": "2.0.0",
    "id": "intver_01JFAQY1A6AQGSZRPKRJ11649R"
  },
  "kit": {
    "version": "2.0.0",
    "id": "intver_01JFAQYAZCH51RNSK7XT8ZKFZC"
  },
  "klaviyo": {
    "version": "3.0.2",
    "id": "intver_01K6BFXSKB0G4KMVGJPTR1X835"
  },
  "knack": {
    "version": "2.0.0",
    "id": "intver_01JFAQYKKW7JQJYH5GQW95AXFJ"
  },
  "kustomer": {
    "version": "2.0.0",
    "id": "intver_01JFAQYR6A4M0527JHDSNXN4TY"
  },
  "kylas": {
    "version": "2.0.0",
    "id": "intver_01JFAQYWG9PSP9076S99BE546R"
  },
  "leadsquared": {
    "version": "2.0.0",
    "id": "intver_01JFAQZ0PFZ7W5AJN0MZQJHGW7"
  },
  "leandata": {
    "version": "2.0.0",
    "id": "intver_01JFAQZ54J1MYP5D4WXZ1Z7KK7"
  },
  "less-annoying-crm": {
    "version": "2.0.0",
    "id": "intver_01JFAQZ99G8ZWD4847189A4EGS"
  },
  "line": {
    "version": "2.0.3",
    "id": "intver_01KBFTPABTXFTSGFPXVNSXWM31"
  },
  "linear": {
    "version": "1.2.0",
    "id": "intver_01KCSCJSD7TCP3P6QGX8QHADAP"
  },
  "localiq": {
    "version": "2.0.0",
    "id": "intver_01JFAQZDKZQV3J44CJF074YHXZ"
  },
  "loops": {
    "version": "0.1.2",
    "id": "intver_01K5C65MMSR9EF9ZCNTMVQA786"
  },
  "mailchimp": {
    "version": "0.3.8",
    "id": "intver_01KD3S9EJY0DZ4M0KEZP72BA5S"
  },
  "mailerlite": {
    "version": "3.0.2",
    "id": "intver_01K6BFZTMA8A1Z3KV1QXGWB61S"
  },
  "make": {
    "version": "0.3.6",
    "id": "intver_01KEYXNCV8ZWT6SKSZSJG8B8WG"
  },
  "messenger": {
    "version": "5.1.3",
    "id": "intver_01KESY33QD20ZF8B3PR2WTR971"
  },
  "mindtickle": {
    "version": "2.0.0",
    "id": "intver_01JFAQZNRAZMBAEZ943WY44EXD"
  },
  "mintlify": {
    "version": "1.0.0",
    "id": "intver_01K8TR6NDN8GCZ8TG133Z307YK"
  },
  "mistral-ai": {
    "version": "0.1.0",
    "id": "intver_01KEW1PHNVBBVS57TM74JKCBDH"
  },
  "monday": {
    "version": "1.0.0",
    "id": "intver_01JVYTJE7Q36MG5V3KCR8HVS01"
  },
  "mural": {
    "version": "2.0.0",
    "id": "intver_01JFAQZT1R0PR8C59Z1MHWMG83"
  },
  "notion": {
    "version": "3.0.0",
    "id": "intver_01KF15SA6NPZ1S1470WECYT5D0"
  },
  "nutshell": {
    "version": "2.0.0",
    "id": "intver_01JFAQZYAY7HCM2VTWTZK0GHZ6"
  },
  "okta": {
    "version": "2.0.0",
    "id": "intver_01JFAR02JMED7RK95YXCDRVNXX"
  },
  "openai": {
    "version": "18.0.0",
    "id": "intver_01KCHBZMZEM2017N9C0ND1STA5"
  },
  "outreach": {
    "version": "2.0.0",
    "id": "intver_01JFAR0717CX7YJNEX0FXRR8TN"
  },
  "pandadoc": {
    "version": "2.0.0",
    "id": "intver_01JFAR0BBGR1EGMRR2PRGHRABB"
  },
  "pdf-generator": {
    "version": "0.0.5",
    "id": "intver_01KEYXNX9CQDD2QZ8G41CX4XCA"
  },
  "pimcore": {
    "version": "2.0.0",
    "id": "intver_01JFAR0FRDMZNK1B1EYKTHKANP"
  },
  "pipedrive": {
    "version": "5.0.1",
    "id": "intver_01K6BG0EMJ1FQ0E5DCZZEN9301"
  },
  "pipeliner": {
    "version": "2.0.0",
    "id": "intver_01JFAR0R7XHB7VYX0Q0ETV9B3F"
  },
  "plaid": {
    "version": "2.0.0",
    "id": "intver_01JFAR0WH09T4MRTTQHRAH2ESD"
  },
  "planhat": {
    "version": "2.0.0",
    "id": "intver_01JFAR10SHDPEPXTJN6RRB9H6S"
  },
  "plus/apify": {
    "version": "1.0.3",
    "id": "intver_01K9DGKG0F7T1CZ5XMA07DB84N"
  },
  "plus/brevo-hitl": {
    "version": "2.0.0",
    "id": "intver_01K392AS04342HT6Z2HZZ60A2D"
  },
  "plus/chatwoot": {
    "version": "1.0.4",
    "id": "intver_01KD3BFCBTV2PNJ80V3VYFBC4M"
  },
  "plus/email-notifier": {
    "version": "1.1.1",
    "id": "intver_01KB0YDR2AQ5A8H0GBZ35J51MQ"
  },
  "plus/go-high-level": {
    "version": "1.0.4",
    "id": "intver_01K6BDMWTZ7FNKTGD4N8YDPH1H"
  },
  "plus/google-analytics": {
    "version": "0.2.4",
    "id": "intver_01HXS7S3FCANEG2EN5FKKWH722"
  },
  "plus/google-chat-spaces": {
    "version": "1.0.3",
    "id": "intver_01K6BDNG0ZNW5JXRA5RDQJQCWN"
  },
  "plus/google-sheets": {
    "version": "1.2.5",
    "id": "intver_01K6BDP63K6Y5HFVJ84R7EKP0Y"
  },
  "plus/hitl-api": {
    "version": "0.2.0",
    "id": "intver_01J804C5W78Y5FWHHNVWMR5VM3"
  },
  "plus/hubspot-help-desk-hitl": {
    "version": "3.1.1",
    "id": "intver_01KC2AWT9BDMTHV36AJRVEF4DN"
  },
  "plus/hubspot-hitl": {
    "version": "5.0.4",
    "id": "intver_01K6BF9Q6D3M6T3J3V541ZJC8Z"
  },
  "plus/huggingface": {
    "version": "0.0.1",
    "id": "intver_01J6FP62B7KEHH4NC4R7NBBTW5"
  },
  "plus/intercom-hitl": {
    "version": "2.0.5",
    "id": "intver_01KEWH6D0NF81Q1WB8W8V225A8"
  },
  "plus/jira": {
    "version": "0.2.4",
    "id": "intver_01KCVM0T96KA8YK723W3N8P494"
  },
  "plus/livechat-hitl": {
    "version": "3.0.2",
    "id": "intver_01K6BFYE44DVXKVFXBHKZED8P9"
  },
  "plus/magento2": {
    "version": "2.0.4",
    "id": "intver_01K6BKG43JX1R6ZEB4CXJ6R65D"
  },
  "plus/messaging": {
    "version": "0.2.3",
    "id": "intver_01HVM0R2R0QXWNH3BEZPYFK6ZJ"
  },
  "plus/mixpanel": {
    "version": "0.2.3",
    "id": "intver_01HXABTRSS5J9K0G1S1MPCX8J9"
  },
  "plus/persat": {
    "version": "1.0.0",
    "id": "intver_01K75D7C0JTQ5FY058T1187G32"
  },
  "plus/salesforce": {
    "version": "1.0.2",
    "id": "intver_01JRTXEF3N4CG8D668ANNW40DS"
  },
  "plus/segment": {
    "version": "0.2.4",
    "id": "intver_01HX7R8GHK3BKX2RHER1KYV0VT"
  },
  "plus/sharepoint": {
    "version": "4.1.0",
    "id": "intver_01K8XWKTBHY5AX8JTBV4T0D4V6"
  },
  "plus/sharepoint-excel": {
    "version": "2.2.1",
    "id": "intver_01K6BKHB4TQ5RFVA6W1VKAREFB"
  },
  "plus/shopify-products-sync": {
    "version": "3.0.2",
    "id": "intver_01K8VDHZ8FM3ZDMTYA8Y7EDXTT"
  },
  "plus/twiliovoice": {
    "version": "0.2.3",
    "id": "intver_01K6BKKDTZ1X8ECNS52N96M8AM"
  },
  "plus/zoho": {
    "version": "3.0.0",
    "id": "intver_01JNRREVZ0BA8VKEKMPMRF0DW5"
  },
  "plus/zohosalesiq": {
    "version": "2.0.0",
    "id": "intver_01JP37YJSERZGZQQW369F7W27C"
  },
  "plus/zoho-sales-iq-hitl": {
    "version": "3.0.0",
    "id": "intver_01K397TXPTA9982A829WV7XNX5"
  },
  "plus/zoom": {
    "version": "3.1.1",
    "id": "intver_01KAEBBGJ327TGZ0AZW31H6S19"
  },
  "posthog": {
    "version": "2.0.0",
    "id": "intver_01JFAR153DTQEGNZXMA4PAAV7D"
  },
  "postman": {
    "version": "2.0.0",
    "id": "intver_01JFAR19F7PZWCD9CBKAB30540"
  },
  "quickbooks": {
    "version": "2.0.0",
    "id": "intver_01JFAR1E05TRXX8ZHQ52QMG2KJ"
  },
  "reachdesk": {
    "version": "2.0.0",
    "id": "intver_01JFAR1JD70W5VTGDEDGFQXKEB"
  },
  "resend": {
    "version": "0.1.7",
    "id": "intver_01KD3DJC2CRQMY4CTR7B81697K"
  },
  "revenuehero": {
    "version": "2.0.0",
    "id": "intver_01JFAR1PDG5ZQHDAT4PX3J67N5"
  },
  "rippling": {
    "version": "0.0.4",
    "id": "intver_01JBMK2M3NWMH63ZTQBSQSEXHB"
  },
  "sage": {
    "version": "2.0.0",
    "id": "intver_01JFAR8RTCW2P6C8VWSMN7FQFS"
  },
  "salesflare": {
    "version": "2.0.0",
    "id": "intver_01JFAR2316BGX6S5NS812P3K1Z"
  },
  "salesloft": {
    "version": "2.0.0",
    "id": "intver_01JFAR27CFAGF2479ER2FSSDF7"
  },
  "sap": {
    "version": "2.0.0",
    "id": "intver_01JFAR2BP4TDJTAGWN841KBC1S"
  },
  "seismic": {
    "version": "2.0.0",
    "id": "intver_01JFAR2G7J0GAC6J69K8TN3429"
  },
  "sendgrid": {
    "version": "0.1.8",
    "id": "intver_01KD3DJKTCXG0JMKM0SZ1RWHHQ"
  },
  "showpad": {
    "version": "2.0.0",
    "id": "intver_01JFAR2MD45546TPY7V2CPBAMD"
  },
  "sisense": {
    "version": "2.0.0",
    "id": "intver_01JFAR2RSBXRYQ5YX9JNTP4A9C"
  },
  "slack": {
    "version": "3.1.3",
    "id": "intver_01KD3DJWPSBF4ACKZ9GNWXQG01"
  },
  "smartsheet": {
    "version": "2.0.0",
    "id": "intver_01JFAR2WXTE6FV2C2HP7V0WBTE"
  },
  "splunk": {
    "version": "0.0.4",
    "id": "intver_01JBMK2Y874WV5BGHXYN07HKHE"
  },
  "square": {
    "version": "2.0.0",
    "id": "intver_01JFARACGK6NT3YTKC5KVXVKX6"
  },
  "stripe": {
    "version": "0.5.4",
    "id": "intver_01KEYXP9M7BG0WC3ER5XVYQ1VB"
  },
  "sunco": {
    "version": "1.5.0",
    "id": "intver_01KEF51HC7QZHCETEMXGFH7BBR"
  },
  "surveymonkey": {
    "version": "2.0.0",
    "id": "intver_01JFAR3A2K8BEMP4XHQ7F5R47R"
  },
  "tableau": {
    "version": "2.0.0",
    "id": "intver_01JFAR3E9K4XXVYFE7SSGT1C9E"
  },
  "teamleader": {
    "version": "2.0.0",
    "id": "intver_01JFAR3JKE5HAGV6TBCW7SV4QM"
  },
  "teams": {
    "version": "2.0.1",
    "id": "intver_01KBNJVJYD8KGWR6A02KP96G2D"
  },
  "teamviewer": {
    "version": "2.0.0",
    "id": "intver_01JFAR3PY3EBMYYBKQTZAHESXP"
  },
  "telegram": {
    "version": "1.0.2",
    "id": "intver_01KAXVQFVSXRQGZR0ZJG883V4X"
  },
  "thryv": {
    "version": "2.0.0",
    "id": "intver_01JFAR3VQXXNJTR85472MM0RDY"
  },
  "todoist": {
    "version": "1.0.2",
    "id": "intver_01K899ZQCGQ0W948PKD1D2BQNM"
  },
  "trello": {
    "version": "1.2.0",
    "id": "intver_01KEF51YE9E2WY0PWVJQ8K2QX6"
  },
  "twilio": {
    "version": "1.0.4",
    "id": "intver_01KBFTS3NF4YR5SGN4CSW3AX1F"
  },
  "vcita": {
    "version": "2.0.0",
    "id": "intver_01JFAR3ZXVBWKYYJ53W7C4E4VB"
  },
  "vercel": {
    "version": "2.0.0",
    "id": "intver_01JFAR44YN7JA1Z86S8CACVG5C"
  },
  "viber": {
    "version": "1.0.3",
    "id": "intver_01KBFTSB6JXYZBM3TA3T5R8MZQ"
  },
  "vonage": {
    "version": "1.0.2",
    "id": "intver_01KBFTSKW1GRVHFAHHG2EPBWD5"
  },
  "webchat": {
    "version": "0.3.0",
    "id": "intver_01JBVV0VQW8XN3Z5V9K8DB1M3B"
  },
  "webflow": {
    "version": "3.1.1",
    "id": "intver_01K89A06XPFFX0E3EEG6E77GBG"
  },
  "webhook": {
    "version": "1.1.2",
    "id": "intver_01KAXVRCX3CAGAS63Z4FBBZRYS"
  },
  "whatsapp": {
    "version": "4.5.20",
    "id": "intver_01KCPW32DHHQS3BPJN0HA5MPB2"
  },
  "workable": {
    "version": "0.1.1",
    "id": "intver_01K97QZ0EXNRMJHM8HW5GBGWKW"
  },
  "workday": {
    "version": "2.0.0",
    "id": "intver_01JFARBCCKWG9BS7DT2RBW9D7B"
  },
  "wrike": {
    "version": "2.0.0",
    "id": "intver_01JFAR4H5WXG78YBE7MEG967MW"
  },
  "zapier": {
    "version": "0.3.6",
    "id": "intver_01KAXVRQQG68J08SWT7JRW90FM"
  },
  "zendesk": {
    "version": "3.0.4",
    "id": "intver_01KF15TFJKHTV1HJ5B9Y6H5D9K"
  },
  "zendesk-sell": {
    "version": "2.0.0",
    "id": "intver_01JFAR4NP3JGG1BPV4MFJ2HBC3"
  },
  "zoho": {
    "version": "3.1.2",
    "id": "intver_01KA92S3WKT4FYD0QW54M0QWSH"
  }
};

{/* vale on */}

<OpenInHub integration={integrationVersions.gsheets} />

The Google Sheets integration allows your bot to access and update Google Sheets data in real-time, automating tasks like CRM updates, inventory management, and survey tracking directly within chat.

## Setup

<Tabs>
  <Tab title="Basic configuration">
    <Info>
      You will need:

      * A [published bot](/get-started/quick-start)
      * A [Google account](https://accounts.google.com/)
    </Info>

    <Steps>
      <Step>
        In Botpress Studio, select **Explore Hub** in the upper-right corner.
      </Step>

      <Step>
        Search for the **Google Sheets** integration, then select **Install Integration**.
      </Step>

      <Step>
        In the **Configuration** menu, select **Authorize Google Sheets**.
      </Step>

      <Step>
        Follow the instructions to connect Botpress to your Google account.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Manual configuration">
    For more advanced use cases, you can manually configure the integration using a service account.

    <Info>
      You will need:

      * A [published bot](/get-started/quick-start)
      * A [Google account](https://accounts.google.com/)
      * Access to [Google Cloud Console](https://console.developers.google.com/)
    </Info>

    ### Step 1: Create a Google Cloud project

    <Steps>
      <Step>
        Go to the [Google Cloud Console](https://console.developers.google.com/) and sign in with your Google account.
      </Step>

      <Step>
        Open the project picker dropdown in the top navigation. Then, select **New Project**.
      </Step>

      <Step>
        Enter your project details:

        * **Project name**: Choose a descriptive name for your project.
        * **Organization**: Select your organization (if applicable).
        * **Location**: Choose the appropriate location.
      </Step>

      <Step>
        Select **Create** and wait for the project to be created.
      </Step>

      <Step>
        Verify you're in the correct project by checking the project name next to the Google logo.
      </Step>
    </Steps>

    ### Step 2: Enable the Google Sheets API

    <Steps>
      <Step>
        In the Google Cloud Console, open the left sidebar and go to **API & Services > Credentials**.
      </Step>

      <Step>
        Select **+ Create Credentials > API Key** to create an API key.
      </Step>

      <Step>
        Go to **Library**, search for "Google Sheets API", and select **Enable**.
      </Step>
    </Steps>

    ### Step 3: Create a service account

    <Steps>
      <Step>
        Open the left sidebar and go to **API & Services > Credentials**.
      </Step>

      <Step>
        Select **+ Create Credentials > Service Account**.
      </Step>

      <Step>
        Enter a **Service account name**. The Service Account ID will be automatically generated.
      </Step>

      <Step>
        The remaining fields are optional. Select **Done** to create the service account.
      </Step>

      <Step>
        Select your newly created service account, then go to the **Keys** tab.
      </Step>

      <Step>
        Select **Add Key > Create new key**, choose **JSON** as the key type, then select **Create**.

        A JSON file will be downloaded to your machine. Keep this file secure—you'll need it to configure the integration.
      </Step>
    </Steps>

    <Note>
      The downloaded JSON file contains sensitive credentials. Store it securely and never share it publicly. The file structure looks like this:

      ```json theme={null}
      {
        "type": "service_account",
        "project_id": "your-project-id",
        "private_key_id": "...",
        "private_key": "...",
        "client_email": "your-service-account@your-project.iam.gserviceaccount.com",
        "client_id": "...",
        "auth_uri": "...",
        "token_uri": "...",
        "auth_provider_x509_cert_url": "...",
        "client_x509_cert_url": "...",
        "universe_domain": "googleapis.com"
      }
      ```
    </Note>

    ### Step 4: Grant spreadsheet access to the service account

    <Steps>
      <Step>
        Open your Google Sheets spreadsheet in your browser.
      </Step>

      <Step>
        Select the **Share** button in the upper-right corner.
      </Step>

      <Step>
        Open the JSON file you downloaded and copy the `client_email` value.
      </Step>

      <Step>
        Paste the `client_email` into the **Add people and groups** field, as if you were inviting someone to access your spreadsheet.
      </Step>

      <Step>
        Set the permission to **Editor** so the bot can read and write to the spreadsheet. Then select **Send**.
      </Step>
    </Steps>

    ### Step 5: Configure the integration in Botpress

    <Steps>
      <Step>
        In Botpress Studio, select **Explore Hub** in the upper-right corner.
      </Step>

      <Step>
        Search for the **Google Sheets** integration, then select **Install Integration**.
      </Step>

      <Step>
        In the **Configuration** menu, select the drop-down and choose **Configure manually with a Service Account Key**.
      </Step>
    </Steps>

    Fill in the integration's configuration fields:

    <AccordionGroup>
      <Accordion title="Spreadsheet ID">
        1. Open your Google Sheets spreadsheet in your browser.
        2. Copy the ID from the URL. The ID is the string between `/d/` and `/edit` in the URL.

        For example, if your URL is `https://docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYz/edit`, the Spreadsheet ID is `1AbCdEfGhIjKlMnOpQrStUvWxYz`.
      </Accordion>

      <Accordion title="Client Email">
        Open the JSON file you downloaded in [Step 3](#step-3-create-a-service-account) and copy the `client_email` value.
      </Accordion>

      <Accordion title="Private Key">
        Open the JSON file you downloaded in [Step 3](#step-3-create-a-service-account) and copy the entire `private_key` value, including the `-----BEGIN PRIVATE KEY-----` and `-----END PRIVATE KEY-----` markers.
      </Accordion>
    </AccordionGroup>

    When you've filled in all the fields, select **Save Configuration**.

    <Check>
      You've successfully configured the Google Sheets integration!
    </Check>
  </Tab>
</Tabs>

***

## Cards

<Note>
  For Cards that take [named ranges](https://support.google.com/docs/answer/63175?hl=en\&co=GENIE.Platform%3DDesktop) as input, Google's standard restrictions for range names apply. Range names:

  * Can contain only letters, numbers, and underscores
  * Can't start with a number, or the words "true" or "false"
  * Can't contain any spaces or punctuation
  * Must be 1–250 characters
  * Can't be in either A1 or R1C1 syntax. For example, you might get an error if you give your range a name like `A1:B2` or `R1C1:R2C2`
</Note>

{/* vale off */}

Here's a reference for all [Cards](/studio/concepts/cards/introduction) available with the integration:

### Add Sheet

<span>
  {"Adds a new sheet to the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="title" type="string" required>
      <span>
        {"The title of the new sheet to add to the spreadsheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="spreadsheetId" type="string" required>
      <span>
        {"The spreadsheet ID of the new sheet."}
      </span>
    </ResponseField>

    <ResponseField name="newSheet" type="object" required>
      <span>
        {"The new sheet that was added to the spreadsheet."}
      </span>

      <Expandable>
        <ResponseField name="sheetId" type="number" required>
          <span>
            {"The ID of the new sheet."}
          </span>
        </ResponseField>

        <ResponseField name="title" type="string" required>
          <span>
            {"The title of the new sheet."}
          </span>
        </ResponseField>

        <ResponseField name="index" type="number" required>
          <span>
            {"The index of the new sheet within the spreadsheet."}
          </span>
        </ResponseField>

        <ResponseField name="isHidden" type="boolean" required>
          <span>
            {"Whether the new sheet is hidden."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Append Values

<span>
  {"Appends values to the spreadsheet. The input startColumn is used to search for existing data and find a \"table\" within that range. Values will be appended to the next row of the table, starting with the first column of the table."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="startColumn" type="string" required>
      <span>
        {"The start column letter(s) (e.g. \"A\", \"B\", \"AA\"). The range will be constructed from this column row 1 to column row 100000."}
      </span>
    </ResponseField>

    <ResponseField name="majorDimension" type="enum<string>" default="ROWS">
      <span>
        {"If it equals \"ROWS\", then the values are inserted as rows. If it equals \"COLUMNS\", then the values are inserted as columns."}
      </span>

      Available options: `ROWS`, `COLUMNS`
    </ResponseField>

    <ResponseField name="values" type="array" required>
      <span>
        {"The values to write to the range. This is an array of arrays, where each inner array represents a major dimension (a row or column) of data. (e.g. [[\"a\", \"b\"], [\"c\", \"d\"]])"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="spreadsheetId" type="string" required>
      <span>
        {"The spreadsheet the updates were applied to."}
      </span>
    </ResponseField>

    <ResponseField name="tableRange" type="string" required>
      <span>
        {"The range (in A1 notation) of the table that values are being appended to (before the values were appended). Empty if no table was found."}
      </span>
    </ResponseField>

    <ResponseField name="updates" type="object" required>
      <span>
        {"The updates that were applied to the spreadsheet."}
      </span>

      <Expandable>
        <ResponseField name="spreadsheetId" type="string" required>
          <span>
            {"The spreadsheet the updates were applied to."}
          </span>
        </ResponseField>

        <ResponseField name="updatedRange" type="string" required>
          <span>
            {"The range (in A1 notation) that updates were applied to."}
          </span>
        </ResponseField>

        <ResponseField name="updatedRows" type="number" required>
          <span>
            {"The number of rows where at least one cell in the row was updated."}
          </span>
        </ResponseField>

        <ResponseField name="updatedColumns" type="number" required>
          <span>
            {"The number of columns where at least one cell in the column was updated."}
          </span>
        </ResponseField>

        <ResponseField name="updatedCells" type="number" required>
          <span>
            {"The number of cells updated."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Clear Values

<span>
  {"Clears values from a spreadsheet. Only values are cleared; all other properties of the cell (such as formatting, data validation, etc..) are kept."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="range" type="string" required>
      <span>
        {"The A1 notation of the range to clear. (e.g. \"Sheet1!A1:B2\")"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="spreadsheetId" type="string" required>
      <span>
        {"The spreadsheet the updates were applied to."}
      </span>
    </ResponseField>

    <ResponseField name="clearedRange" type="string" required>
      <span>
        {"The range (in A1 notation) that was cleared."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Create Named Range in Sheet

<span>
  {"Creates a named range in a sheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetId" type="number" required>
      <span>
        {"The ID of the sheet to create the named range in."}
      </span>
    </ResponseField>

    <ResponseField name="rangeName" type="string" required>
      <span>
        {"The name of the named range."}
      </span>
    </ResponseField>

    <ResponseField name="rangeA1" type="string" required>
      <span>
        {"The A1 notation of the range to associate with the named range. (e.g. \"Sheet1!A1:B2\")"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="namedRangeId" type="string" required>
      <span>
        {"The ID of the new named range."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Delete Rows

<span>
  {"Delete one or more rows by their 1-based indexes. Rows are deleted in reverse order to preserve indexes during deletion."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="rowIndexes" type="array" required>
      <span>
        {"The 1-based row indexes to delete."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="deletedCount" type="number" required>
      <span>
        {"The number of rows deleted."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Delete Sheet

<span>
  {"Deletes a sheet from the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetId" type="number" required>
      <span>
        {"The ID of the sheet to delete."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  This Card has no output.
</ResponseField>

### Find Row (First Match)

<span>
  {"Search for the first row where a specific column matches a value. Returns the row data and its index, or null if no match is found."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="searchColumn" type="string" required>
      <span>
        {"The column letter to search in (e.g. \"A\", \"B\", \"AA\")."}
      </span>
    </ResponseField>

    <ResponseField name="searchValue" type="string" required>
      <span>
        {"The value to search for in the specified column."}
      </span>
    </ResponseField>

    <ResponseField name="dataRange" type="string">
      <span>
        {"Optional A1 notation range to limit the search (e.g. \"A1:F100\"). If not provided, searches the entire sheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="found" type="boolean" required>
      <span>
        {"Whether a matching row was found."}
      </span>
    </ResponseField>

    <ResponseField name="row" type="object | null" required />
  </Expandable>
</ResponseField>

### Find Rows

<span>
  {"Search for rows where a specific column matches a value. Returns all matching rows with their indexes. Handles empty sheets and no matches gracefully by returning an empty array."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="searchColumn" type="string" required>
      <span>
        {"The column letter to search in (e.g. \"A\", \"B\", \"AA\")."}
      </span>
    </ResponseField>

    <ResponseField name="searchValue" type="string" required>
      <span>
        {"The value to search for in the specified column."}
      </span>
    </ResponseField>

    <ResponseField name="dataRange" type="string">
      <span>
        {"Optional A1 notation range to limit the search (e.g. \"A1:F100\"). If not provided, searches the entire sheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="rows" type="array" required>
      <span>
        {"The rows that match the search criteria."}
      </span>

      <Expandable title="array item properties">
        <ResponseField name="rowIndex" type="number" required>
          <span>
            {"The 1-based index of the row in the sheet."}
          </span>
        </ResponseField>

        <ResponseField name="values" type="array" required>
          <span>
            {"The cell values in the row."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="totalMatches" type="number" required>
      <span>
        {"The total number of matching rows found."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Get All Sheets in Spreadsheet

<span>
  {"Returns all sheets in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  This Card has no input fields.
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="sheets" type="array" required>
      <span>
        {"The sheets present in the spreadsheet."}
      </span>

      <Expandable title="array item properties">
        <ResponseField name="sheetId" type="number" required>
          <span>
            {"The ID of the sheet."}
          </span>
        </ResponseField>

        <ResponseField name="title" type="string" required>
          <span>
            {"The name of the sheet."}
          </span>
        </ResponseField>

        <ResponseField name="index" type="number" required>
          <span>
            {"The index of the sheet within the spreadsheet."}
          </span>
        </ResponseField>

        <ResponseField name="isHidden" type="boolean" required>
          <span>
            {"Whether the sheet is hidden."}
          </span>
        </ResponseField>

        <ResponseField name="hasProtectedRanges" type="boolean" required>
          <span>
            {"Whether the sheet has protected ranges."}
          </span>
        </ResponseField>

        <ResponseField name="isFullyProtected" type="boolean" required>
          <span>
            {"Whether the entire sheet is protected."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Get Info of a SpreadSheet

<span>
  {"Returns the properties and metadata of the specified spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="fields" type="array" required>
      <span>
        {"The fields to include in the response when retrieving spreadsheet properties and metadata. This is a list of field names. (eg. spreadsheetId, properties.title, sheets.properties.sheetId, sheets.properties.title)"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="spreadsheetId" type="string | null">
      <span>
        {"The unique identifier of the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="spreadsheetUrl" type="string | null">
      <span>
        {"The URL of the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="dataSources" type="array">
      <span>
        {"The data sources connected to the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="dataSourceSchedules" type="array">
      <span>
        {"The schedules of the data sources."}
      </span>
    </ResponseField>

    <ResponseField name="developerMetadata" type="array">
      <span>
        {"The developer metadata associated with the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="namedRanges" type="array">
      <span>
        {"The named ranges defined in the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="properties" type="string">
      <span>
        {"The properties of the spreadsheet."}
      </span>
    </ResponseField>

    <ResponseField name="sheets" type="array">
      <span>
        {"The sheets present in the spreadsheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Get Named Ranges

<span>
  {"Returns all named ranges in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  This Card has no input fields.
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="namedRanges" type="array" required>
      <span>
        {"The named ranges defined in the spreadsheet."}
      </span>

      <Expandable title="array item properties">
        <ResponseField name="namedRangeId" type="string" required>
          <span>
            {"The ID of the named range."}
          </span>
        </ResponseField>

        <ResponseField name="name" type="string" required>
          <span>
            {"The name of the named range."}
          </span>
        </ResponseField>

        <ResponseField name="range" type="string" required>
          <span>
            {"The range of the named range in A1 notation. (e.g. \"A1:B2\")"}
          </span>
        </ResponseField>

        <ResponseField name="sheetId" type="number" required>
          <span>
            {"The ID of the sheet the named range applies to."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Get Protected Ranges

<span>
  {"Returns all protected ranges in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  This Card has no input fields.
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="protectedRanges" type="array" required>
      <span>
        {"The protected ranges defined in the spreadsheet."}
      </span>

      <Expandable title="array item properties">
        <ResponseField name="protectedRangeId" type="number" required>
          <span>
            {"The ID of the protected range."}
          </span>
        </ResponseField>

        <ResponseField name="namedRangeId" type="string" required>
          <span>
            {"The ID of the named range, if the protected range is backed by a named range."}
          </span>
        </ResponseField>

        <ResponseField name="range" type="string" required>
          <span>
            {"The range of the protected range in A1 notation. (e.g. \"A1:B2\")"}
          </span>
        </ResponseField>

        <ResponseField name="sheetId" type="number" required>
          <span>
            {"The ID of the sheet the protected range applies to."}
          </span>
        </ResponseField>

        <ResponseField name="description" type="string" required>
          <span>
            {"The description of the protected range."}
          </span>
        </ResponseField>

        <ResponseField name="warningOnly" type="boolean" required>
          <span>
            {"Whether the protection displays a warning but still allows editing."}
          </span>
        </ResponseField>

        <ResponseField name="requestingUserCanEdit" type="boolean" required>
          <span>
            {"Whether the user adding the protection can edit the protected range."}
          </span>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Get Row

<span>
  {"Fetch a specific row by its 1-based index. Provides direct row access without A1 notation math."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="rowIndex" type="number" required>
      <span>
        {"The 1-based row index to retrieve (e.g. 1 for the first row, 2 for the second row)."}
      </span>
    </ResponseField>

    <ResponseField name="startColumn" type="string" default="A">
      <span>
        {"The starting column letter (e.g. \"A\"). Defaults to \"A\"."}
      </span>
    </ResponseField>

    <ResponseField name="endColumn" type="string">
      <span>
        {"The ending column letter (e.g. \"Z\"). If not provided, returns all columns with data."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="found" type="boolean" required>
      <span>
        {"Whether the row exists and has data."}
      </span>
    </ResponseField>

    <ResponseField name="row" type="object | null" required />
  </Expandable>
</ResponseField>

### Get Values

<span>
  {"Returns the values of a range in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="range" type="string" required>
      <span>
        {"The A1 notation of the range to retrieve. (e.g. \"Sheet1!A1:B2\")"}
      </span>
    </ResponseField>

    <ResponseField name="majorDimension" type="enum<string>" default="ROWS">
      <span>
        {"If it equals \"ROWS\", then the values are returned as rows. If it equals \"COLUMNS\", then the values are returned as columns."}
      </span>

      Available options: `ROWS`, `COLUMNS`
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="range" type="string" required>
      <span>
        {"The range the values cover, in A1 notation. This range indicates the entire requested range, even though the values will exclude trailing rows and columns. (e.g. \"Sheet1!A1:B2\")"}
      </span>
    </ResponseField>

    <ResponseField name="majorDimension" type="enum<string>" default="ROWS">
      <span>
        {"If it equals \"ROWS\", then the values are returned in rows. If it equals \"COLUMNS\", then the values are returned in columns."}
      </span>

      Available options: `ROWS`, `COLUMNS`
    </ResponseField>

    <ResponseField name="values" type="array" required>
      <span>
        {"The data that was read. This is an array of arrays, the outer array representing all the data and each inner array representing a major dimension (a row or column). Each item in the inner array corresponds with one cell. (e.g. [[\"a\", \"b\"], [\"c\", \"d\"]])"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Insert Row at Index

<span>
  {"Insert a new row at a specific 1-based index. Existing rows at and below the index are shifted down."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="rowIndex" type="number" required>
      <span>
        {"The 1-based index where the new row should be inserted."}
      </span>
    </ResponseField>

    <ResponseField name="values" type="array">
      <span>
        {"Optional values to populate the new row."}
      </span>
    </ResponseField>

    <ResponseField name="startColumn" type="string" default="A">
      <span>
        {"The starting column letter for the values (e.g. \"A\"). Defaults to \"A\"."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="insertedRowIndex" type="number" required>
      <span>
        {"The 1-based index of the newly inserted row."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Move Sheet Horizontally

<span>
  {"Moves a sheet to a new index in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetId" type="number" required>
      <span>
        {"The ID of the sheet to move."}
      </span>
    </ResponseField>

    <ResponseField name="newIndex" type="number" required>
      <span>
        {"The new index of the sheet within the spreadsheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  This Card has no output.
</ResponseField>

### Protect Named Range

<span>
  {"Creates a protected range from a named range, preventing modification."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="namedRangeId" type="string" required>
      <span>
        {"The ID of the named range to protect."}
      </span>
    </ResponseField>

    <ResponseField name="warningOnly" type="boolean">
      <span>
        {"Whether the protection displays a warning but still allows editing."}
      </span>
    </ResponseField>

    <ResponseField name="requestingUserCanEdit" type="boolean">
      <span>
        {"Whether the user adding the protection can edit the protected range."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="protectedRangeId" type="number" required>
      <span>
        {"The ID of the new protected range."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Rename Sheet

<span>
  {"Renames a sheet in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetId" type="number" required>
      <span>
        {"The ID of the sheet to rename."}
      </span>
    </ResponseField>

    <ResponseField name="newTitle" type="string" required>
      <span>
        {"The new title of the sheet."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  This Card has no output.
</ResponseField>

### Set Sheet Visibility

<span>
  {"Sets the visibility of a sheet in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetId" type="number" required>
      <span>
        {"The ID of the sheet to set visibility."}
      </span>
    </ResponseField>

    <ResponseField name="isHidden" type="boolean" required>
      <span>
        {"Whether the sheet is hidden."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  This Card has no output.
</ResponseField>

### Set Values

<span>
  {"Sets values in a range in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="range" type="string" required>
      <span>
        {"The A1 notation of the range to update. (e.g. \"Sheet1!A1:B2\")"}
      </span>
    </ResponseField>

    <ResponseField name="majorDimension" type="enum<string>" default="ROWS">
      <span>
        {"If it equals \"ROWS\", then the values are inserted as rows. If it equals \"COLUMNS\", then the values are inserted as columns."}
      </span>

      Available options: `ROWS`, `COLUMNS`
    </ResponseField>

    <ResponseField name="values" type="array" required>
      <span>
        {"The values to write to the range. This is an array of arrays, where each inner array represents a major dimension (a row or column) of data. (e.g. [[\"a\", \"b\"], [\"c\", \"d\"]])"}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="spreadsheetId" type="string" required>
      <span>
        {"The spreadsheet the updates were applied to."}
      </span>
    </ResponseField>

    <ResponseField name="updatedRange" type="string" required>
      <span>
        {"The range (in A1 notation) that updates were applied to."}
      </span>
    </ResponseField>

    <ResponseField name="updatedRows" type="number" required>
      <span>
        {"The number of rows where at least one cell in the row was updated."}
      </span>
    </ResponseField>

    <ResponseField name="updatedColumns" type="number" required>
      <span>
        {"The number of columns where at least one cell in the column was updated."}
      </span>
    </ResponseField>

    <ResponseField name="updatedCells" type="number" required>
      <span>
        {"The number of cells updated."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Unprotect Range

<span>
  {"Removes protection from a protected range in the spreadsheet."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="protectedRangeId" type="number" required>
      <span>
        {"The ID of the protected range to unprotect."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  This Card has no output.
</ResponseField>

### Update Row

<span>
  {"Update a specific row by its 1-based index with a partial or complete set of values. Only the provided values are updated."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="rowIndex" type="number" required>
      <span>
        {"The 1-based row index to update."}
      </span>
    </ResponseField>

    <ResponseField name="values" type="array" required>
      <span>
        {"The values to write to the row, starting from the start column."}
      </span>
    </ResponseField>

    <ResponseField name="startColumn" type="string" default="A">
      <span>
        {"The starting column letter for the update (e.g. \"A\"). Defaults to \"A\"."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="updatedRange" type="string" required>
      <span>
        {"The range (in A1 notation) that was updated."}
      </span>
    </ResponseField>

    <ResponseField name="updatedCells" type="number" required>
      <span>
        {"The number of cells updated."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

### Upsert Row

<span>
  {"Update a row if it exists (based on a key column match), or append a new row if no match is found. Useful for maintaining unique records."}
</span>

<ResponseField name="input" type="object">
  <Expandable>
    <ResponseField name="sheetName" type="string">
      <span>
        {"The name of the sheet (e.g. \"Sheet1\"). If not provided, the first visible sheet is used."}
      </span>
    </ResponseField>

    <ResponseField name="keyColumn" type="string" required>
      <span>
        {"The column letter to use for matching (e.g. \"A\" for ID column)."}
      </span>
    </ResponseField>

    <ResponseField name="keyValue" type="string" required>
      <span>
        {"The value to match in the key column."}
      </span>
    </ResponseField>

    <ResponseField name="values" type="array" required>
      <span>
        {"The values to write to the row."}
      </span>
    </ResponseField>

    <ResponseField name="startColumn" type="string" default="A">
      <span>
        {"The starting column letter for the values (e.g. \"A\"). Defaults to \"A\"."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="output" type="object">
  <Expandable>
    <ResponseField name="action" type="enum<string>" required>
      <span>
        {"Whether the row was updated or inserted."}
      </span>

      Available options: `updated`, `inserted`
    </ResponseField>

    <ResponseField name="rowIndex" type="number" required>
      <span>
        {"The 1-based index of the affected row."}
      </span>
    </ResponseField>
  </Expandable>
</ResponseField>
