SHEETS_COPY - Copiar Planilha ou Aba do Google Sheets
O que é este Node?
O SHEETS_COPY é o node responsável por duplicar uma planilha inteira ou copiar uma aba (sheet) dentro da mesma planilha ou para outra.
Por que este Node existe?
Copiar estruturas poupa tempo e mantém consistência. O SHEETS_COPY existe para:
- Templates: Duplicar estrutura padrão para novo projeto
- Backup: Criar cópia de segurança antes de modificações
- Versões: Manter histórico copiando dados periodicamente
- Organização: Separar dados por período copiando aba
Como funciona internamente?
Quando o SHEETS_COPY é executado, o sistema:
- Autentica: Valida tokens OAuth2
- Identifica fonte: Determina aba ou planilha a copiar
- Executa duplicateSheet: Chama API apropriada
- Cria cópia: Duplica estrutura, dados e formatação
- Retorna IDs: Devolve ID da nova aba/planilha
Código interno (baseado na API Google Sheets):
case 'copy':
if (data.copyType === 'sheet') {
// Copiar aba dentro da mesma planilha
const copyResult = await sheets.spreadsheets.batchUpdate({
spreadsheetId: data.spreadsheetId,
requestBody: {
requests: [{
duplicateSheet: {
sourceSheetId: data.sourceSheetId,
newSheetName: data.newSheetName,
},
}],
},
});
return {
success: true,
newSheetId: copyResult.data.replies[0].duplicateSheet.properties.sheetId,
newSheetName: copyResult.data.replies[0].duplicateSheet.properties.title,
};
} else if (data.copyType === 'spreadsheet') {
// Copiar planilha inteira
const copyResult = await drive.files.copy({
fileId: data.spreadsheetId,
requestBody: {
name: data.newSpreadsheetName,
},
});
return {
success: true,
newSpreadsheetId: copyResult.data.id,
newSpreadsheetUrl: `https://docs.google.com/spreadsheets/d/${copyResult.data.id}/edit`,
};
}
Quando você DEVE usar este Node?
Use SHEETS_COPY quando precisar duplicar estrutura ou dados:
Casos de uso
- Template Mensal: "Copiar aba 'Template' para criar 'Janeiro_2025'"
- Backup: "Duplicar planilha inteira antes de modificações grandes"
- Histórico: "Copiar aba 'Dados' para 'Backup_2025-01-15'"
- Novos Projetos: "Copiar planilha 'Template_Projeto' para novo cliente"
Quando NÃO usar SHEETS_COPY
- Apenas dados específicos: Use SHEETS_READ + SHEETS_WRITE
- Nova planilha vazia: Use SHEETS_CREATE
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "copy" |
| copyType | string | Sim | "sheet" (aba) ou "spreadsheet" (planilha inteira) |
| spreadsheetId | string | Sim | ID da planilha fonte |
| sourceSheetId | number | Condicional | ID da aba (se copyType=sheet) |
| newSheetName | string | Condicional | Nome da nova aba (se copyType=sheet) |
| newSpreadsheetName | string | Condicional | Nome da nova planilha (se copyType=spreadsheet) |
| accessToken | string | Sim | Token OAuth2 |
| refreshToken | string | Sim | Token OAuth2 refresh |
Exemplo 1: Duplicar Aba para Novo Mês
Objetivo: Copiar aba template para criar estrutura do novo mês
JSON para Importar
{
"name": "Duplicar Aba Template",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome Novo Mês",
"parameters": {
"variableName": "nome_mes",
"value": "Vendas_{{MONTH}}_{{YEAR}}"
}
}
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Copiar Template",
"parameters": {
"operation": "copy",
"copyType": "sheet",
"spreadsheetId": "1Vendas_Master_XYZ",
"sourceSheetId": 0,
"newSheetName": "{{nome_mes}}",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Aba '{{nome_mes}}' criada a partir do template"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Aba 'Vendas_Janeiro_2025' criada a partir do template
Exemplo 2: Backup de Planilha Inteira
Objetivo: Criar cópia completa da planilha antes de modificações
JSON para Importar
{
"name": "Backup Planilha Completa",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Criar Backup",
"parameters": {
"operation": "copy",
"copyType": "spreadsheet",
"spreadsheetId": "1Dados_Importantes_XYZ",
"newSpreadsheetName": "BACKUP_Dados_{{DATE}}_{{TIME}}",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "💾 Backup criado!\n\nAcesse: {{sheets_1.newSpreadsheetUrl}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 💾 Backup criado!
Acesse: https://docs.google.com/spreadsheets/d/ABC123/edit
Resposta do Node
{
"success": true,
"newSheetId": 987654321,
"newSheetName": "Vendas_Janeiro_2025"
}
Ou para planilha inteira:
{
"success": true,
"newSpreadsheetId": "1ABC_Backup_XYZ",
"newSpreadsheetUrl": "https://docs.google.com/spreadsheets/d/1ABC_Backup_XYZ/edit"
}
Boas Práticas
✅ SIM: - Use nomes descritivos com data/hora em backups - Copie templates ao invés de recriar estruturas - Documente propósito da cópia - Configure permissões adequadas na cópia
❌ NÃO: - Não copie planilhas muito grandes sem necessidade - Não esqueça de gerenciar cópias antigas (ocupam espaço) - Não copie dados sensíveis sem controle de acesso
Dicas
💡 Dica 1: Para copiar aba, você precisa do sheetId (não o nome). Obtenha da URL: /edit#gid=SHEET_ID
💡 Dica 2: Copiar planilha inteira duplica TUDO: abas, formatação, fórmulas, gráficos.
💡 Dica 3: Salve o newSpreadsheetId ou newSheetId retornado para operar na cópia.
Próximo Node
→ SHEETS_CREATE - Criar nova planilha vazia → SHEETS_WRITE - Escrever dados na cópia