Pular para conteúdo

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:

  1. Templates: Duplicar estrutura padrão para novo projeto
  2. Backup: Criar cópia de segurança antes de modificações
  3. Versões: Manter histórico copiando dados periodicamente
  4. Organização: Separar dados por período copiando aba

Como funciona internamente?

Quando o SHEETS_COPY é executado, o sistema:

  1. Autentica: Valida tokens OAuth2
  2. Identifica fonte: Determina aba ou planilha a copiar
  3. Executa duplicateSheet: Chama API apropriada
  4. Cria cópia: Duplica estrutura, dados e formatação
  5. 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

  1. Template Mensal: "Copiar aba 'Template' para criar 'Janeiro_2025'"
  2. Backup: "Duplicar planilha inteira antes de modificações grandes"
  3. Histórico: "Copiar aba 'Dados' para 'Backup_2025-01-15'"
  4. 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