"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[2572],{95788:(e,t,r)=>{r.d(t,{Iu:()=>p,yg:()=>h});var o=r(11504);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(r),d=n,h=u["".concat(l,".").concat(d)]||u[d]||g[d]||a;return r?o.createElement(h,s(s({ref:t},p),{},{components:r})):o.createElement(h,s({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,s=new Array(a);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:n,s[1]=i;for(var c=2;c<a;c++)s[c]=r[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},42716:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var o=r(86404),n=(r(11504),r(95788));const a={title:"Google Sheets",hide_title:!0,sidebar_position:21,version:1},s=void 0,i={unversionedId:"databases/google-sheets",id:"databases/google-sheets",title:"Google Sheets",description:"Google Sheets",source:"@site/docs/databases/google-sheets.mdx",sourceDirName:"databases",slug:"/databases/google-sheets",permalink:"/docs/databases/google-sheets",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/google-sheets.mdx",tags:[],version:"current",sidebarPosition:21,frontMatter:{title:"Google Sheets",hide_title:!0,sidebar_position:21,version:1},sidebar:"tutorialSidebar",previous:{title:"Ocient DB",permalink:"/docs/databases/ocient"},next:{title:"Hana",permalink:"/docs/databases/hana"}},l={},c=[{value:"Google Sheets",id:"google-sheets",level:2}],p={toc:c},u="wrapper";function g(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,o.c)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"google-sheets"},"Google Sheets"),(0,n.yg)("p",null,"Google Sheets has a very limited\n",(0,n.yg)("a",{parentName:"p",href:"https://developers.google.com/chart/interactive/docs/querylanguage"},"SQL API"),". The recommended\nconnector library for Google Sheets is ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/betodealmeida/shillelagh"},"shillelagh"),"."),(0,n.yg)("p",null,"There are a few steps involved in connecting Superset to Google Sheets. This\n",(0,n.yg)("a",{parentName:"p",href:"https://preset.io/blog/2020-06-01-connect-superset-google-sheets/"},"tutorial")," has the most up to date\ninstructions on setting up this connection."))}g.isMDXComponent=!0}}]);