> ## Documentation Index
> Fetch the complete documentation index at: https://botpress-charmenta-pr-716.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": "3.0.0",
    "id": "intver_01KQYW202230PVRW9RVA68VRYR"
  },
  "alchemer": {
    "version": "2.0.0",
    "id": "intver_01JFAQQZRS9ZQ7WBWHCF1MKGCM"
  },
  "anthropic": {
    "version": "18.0.1",
    "id": "intver_01KQYW62BM57D669VPPSAKXGHG"
  },
  "anydesk": {
    "version": "2.0.0",
    "id": "intver_01JFAQR4048H4976FCKT2YHD2X"
  },
  "apollo": {
    "version": "3.0.2",
    "id": "intver_01K6BJFKR5WZV44VNENAN6XBT1"
  },
  "asana": {
    "version": "0.3.13",
    "id": "intver_01KMZACD2E15B0RZB8RJ2XN2JX"
  },
  "attio": {
    "version": "1.0.3",
    "id": "intver_01KMZACN5Z3VJK0W280ED7G4Y0"
  },
  "avoma": {
    "version": "2.0.0",
    "id": "intver_01JFAQRC955G4CXN8QTFHXAPXZ"
  },
  "bamboohr": {
    "version": "2.1.2",
    "id": "intver_01KMZACXWM0GDNQF5PS3QBPQDN"
  },
  "beehiiv": {
    "version": "2.0.0",
    "id": "intver_01JFAQRGRRB95YC5YKWB1BFHZH"
  },
  "bigcommerce": {
    "version": "3.2.4",
    "id": "intver_01KMZAD5GM0P6BGFJHKE2QDDR8"
  },
  "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.8",
    "id": "intver_01KPBEHKBJD4MZ0ZDWEBMHX74D"
  },
  "bynder": {
    "version": "2.0.0",
    "id": "intver_01JFAQSJT5N0Q2J2K7KGG12QQ5"
  },
  "calcom": {
    "version": "0.4.2",
    "id": "intver_01KMZADKWGWXARSDEH5VES64JY"
  },
  "calendly": {
    "version": "0.0.5",
    "id": "intver_01KMZADVPKFVFATR33S36R2NQ8"
  },
  "canny": {
    "version": "0.2.3",
    "id": "intver_01KMZAE3W37N658H69Y6ZPSREQ"
  },
  "capsule-crm": {
    "version": "2.0.0",
    "id": "intver_01JFAQSQ6CJJ6G9FK7PAACKE6X"
  },
  "cerebras": {
    "version": "9.0.0",
    "id": "intver_01KNRZZPBTBA0FAHVDVGAJNBJ1"
  },
  "charts": {
    "version": "0.2.8",
    "id": "intver_01KMZAEJVYBMNRMP01816TVEBH"
  },
  "chat": {
    "version": "1.0.0",
    "id": "intver_01KNSDHSSEHCX633DGB62V2ZB8"
  },
  "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.3",
    "id": "intver_01KMZAF5TCYZNN80SFM4MCASB5"
  },
  "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.4",
    "id": "intver_01KMZAFH0Z4679X7P0SSY18DPV"
  },
  "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.8",
    "id": "intver_01KMZAFVDB02KE332TQ930T76J"
  },
  "databricks": {
    "version": "0.0.4",
    "id": "intver_01JBMK24H270H1ZTH2E8P34V4J"
  },
  "demandbase": {
    "version": "2.0.0",
    "id": "intver_01JFAQV9ZZ9MHH2ENEQ1ERMY2G"
  },
  "desk": {
    "version": "1.0.0",
    "id": "intver_01KGQ972H97YAN3D3KY9425JYN"
  },
  "discord": {
    "version": "1.2.1",
    "id": "intver_01KREWJHF8AZMBHH3JC5XFSFTB"
  },
  "docusign": {
    "version": "2.0.0",
    "id": "intver_01JFAQVKFW4F7BBRSDD7EEZE6Z"
  },
  "dropbox": {
    "version": "2.0.1",
    "id": "intver_01KMZAG63Y41V6CJGWD858VKQN"
  },
  "email": {
    "version": "0.1.4",
    "id": "intver_01KMZAGF70MCA75BCVVY3DGHXD"
  },
  "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.3",
    "id": "intver_01KMZAGPXHR49811P7S89CWN35"
  },
  "fireworks-ai": {
    "version": "11.0.0",
    "id": "intver_01KNS0091R8GPT9C088F3F3PE0"
  },
  "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.5",
    "id": "intver_01KMZAH6YY639ZNJTGDMTH25GT"
  },
  "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.2.1",
    "id": "intver_01KMZAHF5WMDMTT9H6V3DQ8T50"
  },
  "gladly": {
    "version": "2.0.0",
    "id": "intver_01JFAQX7B29WE85VA8N5BCST16"
  },
  "gmail": {
    "version": "1.0.7",
    "id": "intver_01KMZAHQQ8YSB2DRVR1B6YXNCN"
  },
  "google-ai": {
    "version": "8.0.0",
    "id": "intver_01KNS00R1R8P4N2J4SVN6HHX4P"
  },
  "google-analytics": {
    "version": "1.0.0",
    "id": "intver_01KPRHR42CF02FMDDGSF0TG0DB"
  },
  "googlecalendar": {
    "version": "2.0.9",
    "id": "intver_01KMZAJAKBEZKGH0ZPQJBR1VAE"
  },
  "googledrive": {
    "version": "0.4.2",
    "id": "intver_01KMZAJJE94ZYG631DQM93B9RN"
  },
  "groq": {
    "version": "16.0.0",
    "id": "intver_01KNS015P14BRMA1C0CJG239M4"
  },
  "gsheets": {
    "version": "2.1.9",
    "id": "intver_01KP5Z7BRNQNGVY406742M7BBE"
  },
  "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": "6.0.9",
    "id": "intver_01KTV8S0ZX48N54R7AVG24CHJZ"
  },
  "hunter": {
    "version": "1.0.2",
    "id": "intver_01KMZAKV7RM16T6375G0JXDYHH"
  },
  "instagram": {
    "version": "4.1.9",
    "id": "intver_01KRC18D2WGRKT0G2SRZQ5VE3Z"
  },
  "instantly": {
    "version": "2.0.0",
    "id": "intver_01JFAQXWNN3ZM0DAQBE7N2BP54"
  },
  "intercom": {
    "version": "2.0.4",
    "id": "intver_01KMZAMCN5KTKK60239ADVZGCP"
  },
  "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"
  },
  "kommo": {
    "version": "0.1.0",
    "id": "intver_01KN89QSX1YDM04NFRHK0WKZMG"
  },
  "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.6",
    "id": "intver_01KMZAMNQDY2BZAW86RZ58VSQY"
  },
  "linear": {
    "version": "2.5.0",
    "id": "intver_01KRHWEFJX783DXZG4XZ7B6ER8"
  },
  "linkedin": {
    "version": "0.1.3",
    "id": "intver_01KN89RB1CBCP1MGAYEBHMCT5Q"
  },
  "localiq": {
    "version": "2.0.0",
    "id": "intver_01JFAQZDKZQV3J44CJF074YHXZ"
  },
  "loops": {
    "version": "0.1.5",
    "id": "intver_01KMZANASVEZEW761JG63F1RM0"
  },
  "mailchimp": {
    "version": "0.3.12",
    "id": "intver_01KMZANJGYPESPJHZJ7NPEE7C6"
  },
  "mailerlite": {
    "version": "3.0.2",
    "id": "intver_01K6BFZTMA8A1Z3KV1QXGWB61S"
  },
  "make": {
    "version": "0.3.9",
    "id": "intver_01KMZANTJE8DN94EE6K74ETJ0Z"
  },
  "mcp-client": {
    "version": "0.1.0",
    "id": "intver_01KQWWKVJFV3DD65PR233GRHMH"
  },
  "messenger": {
    "version": "5.1.8",
    "id": "intver_01KPDRM4RJN85JM6DRP43W48PX"
  },
  "mindtickle": {
    "version": "2.0.0",
    "id": "intver_01JFAQZNRAZMBAEZ943WY44EXD"
  },
  "mintlify": {
    "version": "1.0.1",
    "id": "intver_01KMZAPEVTD6HZ9BPRHVK09DC5"
  },
  "mistral-ai": {
    "version": "1.0.0",
    "id": "intver_01KNS021C2ZFXWGAXC5TFAXBA9"
  },
  "monday": {
    "version": "1.0.2",
    "id": "intver_01KMZAQ1357YEQBMVPHQ8QYSAF"
  },
  "mural": {
    "version": "2.0.0",
    "id": "intver_01JFAQZT1R0PR8C59Z1MHWMG83"
  },
  "notion": {
    "version": "3.0.5",
    "id": "intver_01KN89RW8Z2ZK98F8JM8X66RXS"
  },
  "nutshell": {
    "version": "2.0.0",
    "id": "intver_01JFAQZYAY7HCM2VTWTZK0GHZ6"
  },
  "odoo": {
    "version": "0.1.0",
    "id": "intver_01KRC19AE1XTHSSW6D0FZPJZ1H"
  },
  "okta": {
    "version": "2.0.0",
    "id": "intver_01JFAR02JMED7RK95YXCDRVNXX"
  },
  "openai": {
    "version": "20.0.0",
    "id": "intver_01KNS02E7FF0WQAYXWJDM3ZZNQ"
  },
  "outreach": {
    "version": "2.0.0",
    "id": "intver_01JFAR0717CX7YJNEX0FXRR8TN"
  },
  "pandadoc": {
    "version": "2.0.0",
    "id": "intver_01JFAR0BBGR1EGMRR2PRGHRABB"
  },
  "pdf-generator": {
    "version": "0.0.7",
    "id": "intver_01KMZAQP6WG231KVJSEY88KG2J"
  },
  "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.4",
    "id": "intver_01KH6R8P2ZYNACH8KQED02E9YC"
  },
  "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"
  },
  "postmark": {
    "version": "0.1.0",
    "id": "intver_01KQ01G3YEPEXVNP2SFH49079G"
  },
  "quickbooks": {
    "version": "2.0.0",
    "id": "intver_01JFAR1E05TRXX8ZHQ52QMG2KJ"
  },
  "reachdesk": {
    "version": "2.0.0",
    "id": "intver_01JFAR1JD70W5VTGDEDGFQXKEB"
  },
  "resend": {
    "version": "0.1.10",
    "id": "intver_01KMZAQXVC4KP20TFCJNGY8PKV"
  },
  "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"
  },
  "salesforce": {
    "version": "1.0.0",
    "id": "intver_01KN5FRKT6KRAB6RM9T34J70M2"
  },
  "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.10",
    "id": "intver_01KMZAR5KN275G2NPSSFZ9WTSE"
  },
  "showpad": {
    "version": "2.0.0",
    "id": "intver_01JFAR2MD45546TPY7V2CPBAMD"
  },
  "sisense": {
    "version": "2.0.0",
    "id": "intver_01JFAR2RSBXRYQ5YX9JNTP4A9C"
  },
  "slack": {
    "version": "5.0.2",
    "id": "intver_01KQF3XKNH2W5EPAXK6G4CMW96"
  },
  "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.6",
    "id": "intver_01KMZARNC46Y0CJTQNR5AA8AKD"
  },
  "sunco": {
    "version": "2.0.1",
    "id": "intver_01KMZARX5E90SJEDCQ6GKZ4ZBV"
  },
  "surveymonkey": {
    "version": "2.0.0",
    "id": "intver_01JFAR3A2K8BEMP4XHQ7F5R47R"
  },
  "tableau": {
    "version": "2.0.0",
    "id": "intver_01JFAR3E9K4XXVYFE7SSGT1C9E"
  },
  "tally": {
    "version": "0.1.2",
    "id": "intver_01KMZAS4KR8F34JNE9VP1HJXT9"
  },
  "teamleader": {
    "version": "2.0.0",
    "id": "intver_01JFAR3JKE5HAGV6TBCW7SV4QM"
  },
  "teams": {
    "version": "2.0.4",
    "id": "intver_01KMZASBVV28FFKB2227618RRM"
  },
  "teamviewer": {
    "version": "2.0.0",
    "id": "intver_01JFAR3PY3EBMYYBKQTZAHESXP"
  },
  "telegram": {
    "version": "1.0.7",
    "id": "intver_01KQYYDZKSAHXH5DRK1ES6CKNS"
  },
  "thryv": {
    "version": "2.0.0",
    "id": "intver_01JFAR3VQXXNJTR85472MM0RDY"
  },
  "todoist": {
    "version": "1.0.5",
    "id": "intver_01KMZASWGQHERWV5WESYJR1W1R"
  },
  "trello": {
    "version": "2.1.3",
    "id": "intver_01KMZAT7K4J1JWT5VCV838TFRN"
  },
  "twilio": {
    "version": "1.3.2",
    "id": "intver_01KMZATFC2J1KF4J3T93HPFKGF"
  },
  "vcita": {
    "version": "2.0.0",
    "id": "intver_01JFAR3ZXVBWKYYJ53W7C4E4VB"
  },
  "vercel": {
    "version": "2.0.0",
    "id": "intver_01JFAR44YN7JA1Z86S8CACVG5C"
  },
  "viber": {
    "version": "1.0.5",
    "id": "intver_01KMZATNKPMTPMYBQNZN6744N4"
  },
  "vonage": {
    "version": "1.0.4",
    "id": "intver_01KMZATWVPMNCXAF3XB72FNHKS"
  },
  "webchat": {
    "version": "0.3.0",
    "id": "intver_01JBVV0VQW8XN3Z5V9K8DB1M3B"
  },
  "webflow": {
    "version": "3.1.4",
    "id": "intver_01KMZAV5CCPAJKR8S1M36266M8"
  },
  "webhook": {
    "version": "1.1.5",
    "id": "intver_01KMZAVBMNBFJBA9SM7ATDS5R8"
  },
  "wechat": {
    "version": "0.1.1",
    "id": "intver_01KMZAVJTKWA8CQ8A7KFRDYR5X"
  },
  "whatsapp": {
    "version": "4.15.0",
    "id": "intver_01KRC1AEDCE4P5HTZP5G41495H"
  },
  "workable": {
    "version": "0.1.2",
    "id": "intver_01KMZAWAMH776SVXW1R98ABBHP"
  },
  "workday": {
    "version": "2.0.0",
    "id": "intver_01JFARBCCKWG9BS7DT2RBW9D7B"
  },
  "wrike": {
    "version": "2.0.0",
    "id": "intver_01JFAR4H5WXG78YBE7MEG967MW"
  },
  "zapier": {
    "version": "0.3.10",
    "id": "intver_01KMZAWN77ZX053EB5VJH7C9B9"
  },
  "zendesk": {
    "version": "3.0.6",
    "id": "intver_01KFGPZM7JH7PMSEBRSSM5C4H8"
  },
  "zendesk-messaging-hitl": {
    "version": "1.1.0",
    "id": "intver_01KPRHTAYTB64Z5QEDC1XZCSYH"
  },
  "zendesk-sell": {
    "version": "2.0.0",
    "id": "intver_01JFAR4NP3JGG1BPV4MFJ2HBC3"
  },
  "zoho": {
    "version": "3.1.4",
    "id": "intver_01KMZAX48A0JA4Q0CD3B7REDT0"
  },
  "zoom": {
    "version": "0.1.0",
    "id": "intver_01KNSQZR3F06SRHJY3BCN20JH9"
  }
};

{/* 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\"). Used to identify the table in the sheet — data will be appended after the last row of the detected table."}
      </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. Must follow naming rules: cannot contain spaces, cannot start with a number, and cannot conflict with standard cell references (e.g., \"A1\", \"R1C1\"). Names violating these rules will be considered invalid."}
      </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>
