TIL: SQL functions in Google Sheets to fetch data from Datasette

Source: simonwillison.net TIL Type: article (TIL) By: simon-willison Valid as of: 2026-04-20

핵심 Takeaway

  • Datasette는 기본으로 CSV 내보내기를 지원 — Google Sheets IMPORTDATA() 함수로 코드 없이 직접 쿼리 결과를 스프레드시트에 로드 가능 (출처: Using IMPORTDATA 섹션)
  • Google Sheets “Named Functions”(Data → Named functions)으로 =SQL("SELECT ...") 커스텀 함수 정의 가능 — 내부적으로 IMPORTDATA() + ENCODEURL() 조합
  • importdata()는 HTTP 헤더 전송 불가 → Bearer 토큰 인증이 필요한 프라이빗 Datasette 인스턴스에 사용 불가. 단, API 토큰을 쿼리 스트링으로 전달하면 우회 가능
  • Google Apps Script로 =datasette_sql(query) 커스텀 셀 함수 구현 시 Bearer 토큰 헤더 포함 HTTP 요청 가능 → 인증된 Datasette 인스턴스도 지원
  • Apps Script “Deploy” 버튼은 커스텀 셀 함수에 불필요 — Cmd+S 저장만으로 즉시 동작

상세 요약

IMPORTDATA() — 공개 인스턴스 빠른 연동

Datasette URL에 .csv 확장자를 추가하거나 /-/query.csv?sql=<SQL> 엔드포인트를 사용하면 CSV 형태의 쿼리 결과를 얻을 수 있다. Google Sheets의 내장 함수 =importdata(url) 는 CSV URL을 받아 셀에 직접 채워넣는다. 추가 코드나 설정 없이 수초 내에 연동 완료.

=importdata("https://latest.datasette.io/fixtures/-/query.csv?sql=select+*+from+roadside_attractions&_size=max")

_size=max 파라미터로 전체 결과 반환 가능.

Named Function — SQL 인터페이스 추상화

Data → Named functions에서 SQL이라는 함수를 정의하고 내부적으로 IMPORTDATA() + ENCODEURL()을 조합하면, 스프레드시트 어디서든 =SQL("SELECT * FROM table") 형태로 쿼리 실행이 가능해진다. SQL 인코딩을 직접 다룰 필요가 없어 UX가 크게 개선된다.

=IMPORTDATA(
  "https://my-datasette.example.com/db/-/query.csv?sql=" &
  ENCODEURL(query)
)

Apps Script — 인증 인스턴스 지원

importdata() 기반 방식은 HTTP 헤더를 보낼 수 없어 Bearer 토큰 인증이 필요한 Datasette 인스턴스에는 사용 불가. 단, datasette-auth-tokens 플러그인을 통해 쿼리 스트링 방식 토큰을 활성화하면 importdata()로도 인증 우회가 가능하다.

완전한 헤더 지원이 필요하면 Google Apps Script를 사용한다. Extensions → Apps Script에서 Code.gs를 편집해 datasette_sql(query) 함수를 정의. UrlFetchApp.fetch()/-/query.json 엔드포인트를 호출하고, JSON 응답에서 rows 배열을 2차원 배열로 변환해 반환한다. Google Sheets는 2차원 배열을 자동으로 셀 범위에 채워넣는다.

주의 사항:

  • “Deploy” 버튼 불필요 — 커스텀 함수는 저장만 하면 즉시 사용 가능
  • 토큰을 소스 코드에 포함해도 “view” 권한 사용자에게는 코드가 노출되지 않으므로 읽기 전용 토큰은 비교적 안전

연결되는 위키 페이지