Selo de estado:
Preview(teto atual do produto) · Curso ACD-210 — Conectores e conexões · Aula 5 de 8 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai configurar SA; distinguir projeto de dados × billing — e autorizar uma planilha por compartilhamento, sem pedir a senha do Google de ninguém.
Vídeo#
Identificador no manifesto: acd-210-05-bigquery-e-google-sheets · duração-alvo 8 min · tela do produto: /conexoes.
Roteiro de gravação (6 capítulos):
| # | Minutagem-alvo | Capítulo | Tela do produto |
|---|---|---|---|
| 1 | 0:00–0:50 | Abertura: título + selo. O seu BigQuery como origem × o BigQuery interno do produto (destino). | /conexoes/nova |
| 2 | 0:50–2:40 | Campos do conector BigQuery: projectId, billingMode, billingProjectId, dataset, location, chave da conta de serviço. | /conexoes/nova |
| 3 | 2:40–4:10 | Projeto de dados × projeto de billing: dataViewer num, jobUser no outro — e quem paga a consulta. | /conexoes/nova |
| 4 | 4:10–5:40 | Google Sheets: saMode plataforma × própria; compartilhar a planilha como Leitor com o e-mail da conta de serviço. | /conexoes/nova |
| 5 | 5:40–7:00 | spreadsheet (cole o link), sheetTitles, headerRow. Teste e descoberta das abas. | /conexoes/nova |
| 6 | 7:00–8:00 | Erros de IAM e de planilha não compartilhada; o "faça você mesmo". | /conexoes |
Conteúdo#
Os dois conectores desta aula são Disponível (maturidade GA-candidato) e compartilham a mesma ideia: autenticação por conta de serviço do Google, não por usuário e senha.
O seu BigQuery não é o nosso
O conector BigQuery lê tabelas do projeto BigQuery do cliente, com a conta de serviço dele, e as traz para a camada Bronze do workspace. Não confunda com o BigQuery interno do produto — o datalake de destino (aurora_bronze / _silver / _gold), que roda com outra identidade. Esta aula é sobre usar o seu BigQuery como origem.
BigQuery: os seis campos que importam
| Campo | Rótulo na tela | Obrigatório | Observação |
|---|---|---|---|
projectId | Projeto dos dados (Project ID) | sim | Onde os datasets e tabelas moram |
billingMode | Cobrança das consultas (billing) | não | same (padrão) ou separate |
billingProjectId | Projeto de billing (Project ID) | não | Só aparece quando billingMode = separate |
dataset | Dataset | não | Vazio lista todos os acessíveis |
location | Location | não | Ex.: southamerica-east1; vazio = automático |
serviceAccountJson 🔒 | Chave da service account (JSON) | sim | Cole o JSON inteiro; é cifrado e nunca reexibido |
Projeto de dados × projeto de billing
É a distinção que decide quem paga e qual IAM conceder. Os jobs de consulta do BigQuery são cobrados no projeto onde rodam, não onde os dados estão.
| Projeto de dados | Projeto de billing | |
|---|---|---|
| O que guarda | Datasets e tabelas que serão lidas | Nada: é só onde o job de consulta roda e é cobrado |
| Papel mínimo da SA | roles/bigquery.dataViewer | roles/bigquery.jobUser |
| Quando é o mesmo | billingMode = same (padrão) — o projeto de dados paga | — |
| Quando separar | Cliente com projeto de dados e projeto de custo distintos | billingMode = separate + billingProjectId |
Os dois sintomas de IAM são inconfundíveis quando você conhece a divisão: Access Denied: … dataViewer é falta de leitura no projeto de dados; User does not have bigquery.jobs.create é falta de jobUser no projeto de billing.
Na carga, o produto cria o job de consulta e faz um probe de 1 linha (descartada) para validar SQL e partição antes de enviar qualquer fragmento — assim um retry nunca duplica dado na landing. Tabelas com require_partition_filter são tratadas automaticamente: o produto monta um predicado que cobre todas as linhas, em vez de falhar. O filtro incremental usa parâmetro nomeado (@since), nunca concatenação.
Google Sheets: autorização por compartilhamento
O Sheets não pede senha do Google nem acesso ao Drive inteiro. Você compartilha a planilha com o e-mail de uma conta de serviço, com permissão de Leitor.
| Campo | Rótulo na tela | Observação |
|---|---|---|
spreadsheet | Link ou ID da planilha | Cole o link da barra de endereço — o ID é extraído sozinho |
sheetTitles | Abas | Separe por vírgula ou ponto e vírgula; vazio traz todas |
headerRow | Linha do cabeçalho | Padrão 1 |
saMode | Conta de serviço | plataforma (padrão) ou propria |
serviceAccountJson 🔒 | Chave JSON da conta de serviço | Só aparece quando saMode = propria |
Com saMode = plataforma você não cola chave nenhuma: a tela mostra o e-mail da conta de serviço a autorizar, e o seu único trabalho é compartilhar a planilha com ele. Com saMode = propria, você traz a sua própria conta de serviço e cola o JSON. O "Testar conexão" indica o e-mail a autorizar e, quando a autorização existe, a descoberta lista as abas e colunas.
Cada aba vira uma tabela na Bronze. Uma aba renomeada não derruba as demais: o erro fica naquela tabela e o laço segue.
Limites e custo
- Paginação: teto duro por execução (default 10.000 páginas / 5.000.000 linhas), com guarda anti-loop.
- BigQuery: extração fragmentada com
batchSizedefault 5.000 (100–50.000) emaxRowsdefault 200.000 (até 5.000.000). - Sheets: paginação por janela de linhas, com checkpoint; carga SaaS default
batchSize5.000,maxRows200.000 por recurso. - Quem paga o quê: as consultas ao seu BigQuery são cobradas no seu projeto de billing (modelo on-demand). A carga para a Bronze consome load job do lado do produto. Custo faturado real = NÃO MEDIDO. A leitura da planilha é R$ 0.
No workspace Aurora Varejo
A Comércio Aurora já tem exportações de marketing num BigQuery próprio: projeto de dados aurora-dados-example, custos centralizados em aurora-billing-example. Maria escolhe billingMode = separate, informa os dois Project IDs, dataset = marketing, location = southamerica-east1 e cola o JSON de uma conta de serviço de treino. O teste volta User does not have bigquery.jobs.create — faltou roles/bigquery.jobUser no projeto de billing, não no de dados. Concedido o papel, a descoberta lista as tabelas.
Em paralelo, a planilha Metas 2026 (sintética) fica com saMode = plataforma: Maria copia o e-mail da conta de serviço que a tela mostra, compartilha a planilha como Leitor e deixa sheetTitles vazio para trazer todas as abas, com headerRow = 1.
Erros comuns
| Sintoma | Causa provável | O que fazer |
|---|---|---|
Access Denied: … dataViewer | SA sem leitura nos dados | Conceda roles/bigquery.dataViewer no projeto de dados |
User does not have bigquery.jobs.create | SA sem jobUser no billing | Conceda roles/bigquery.jobUser no projeto de billing |
Not found: Dataset | Dataset ou location errados | Confira o nome do dataset e a location |
Cannot query … requires a filter | Partição obrigatória na tabela | O produto trata sozinho; persistindo, informe a coluna de partição |
| JSON inválido | Chave colada incompleta | Cole o JSON inteiro da conta de serviço |
| Planilha "não encontrada" | Não compartilhada com a conta de serviço | Compartilhe como Leitor com o e-mail que a tela indica |
| Abas faltando na descoberta | sheetTitles com nome errado | Deixe vazio para trazer todas, ou corrija o nome exato |
| Colunas com nome estranho | headerRow apontando para a linha errada | Ajuste a linha do cabeçalho |
O que esta aula não faz
Ela não configura o BigQuery de destino do workspace (isso é provisionamento do datalake, não conexão) e não concede IAM para você — os GRANTs e papéis acontecem na conta do cliente. O conector é GA-candidato no motor; a extração real continua Preview, dependente da conta de serviço do cliente e do ambiente de nuvem do workspace. Sem ele a execução falha com mensagem.
Faça você mesmo#
No workspace de treino Aurora Varejo, como dono, com uma planilha sintética sua e identificadores *-example.
- Crie uma planilha de treino com duas abas (
MetaseFiliais), cabeçalho na linha 1 e três linhas fictícias em cada. - Em
/conexoes, use Nova conexão → Google Sheets. Cole o link da planilha no campospreadsheete confirme que o produto aceita o link (sem você extrair o ID). - Deixe
saMode = plataforma, copie o e-mail da conta de serviço que a tela mostra e compartilhe a planilha com ele como Leitor. - Deixe
sheetTitlesvazio eheaderRow = 1. Use Testar conexão e confirme que a descoberta lista as duas abas, com as colunas do cabeçalho. - Agora preencha
sheetTitlescom um nome de aba inexistente (Vendas) e teste de novo: registre a diferença na descoberta. Depois volte a deixar vazio e salve com Salvar conexão. - Abra uma segunda tentativa, agora BigQuery, e preencha
projectId = aurora-dados-example. AlternebillingModeentresameeseparatee confirme que o campo Projeto de billing só aparece emseparate. - Escreva, em duas linhas, qual papel IAM você pediria em qual projeto para esse cenário (
dataViewerem dados,jobUserem billing) — e Cancele a tentativa, sem salvar.
Você terminou quando a conexão do Sheets está salva com as duas abas descobertas via compartilhamento (sem nenhuma senha do Google), e você sabe dizer, sem consultar, qual dos dois papéis IAM vai em qual dos dois projetos do BigQuery.
Checagem rápida#
Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.
Documentação relacionada#
- data/tutoriais/conectar-bigquery
- data/conectores/bigquery
- data/conectores/google_sheets
- data/custo-limites-seguranca — tetos e custo por workspace
Capacidades ensinadas#
C04.1 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".