Baixar vários arquivos do SharePoint

Oi a todos,
Estou tentando baixar todos os arquivos de uma pasta específica do SharePoint (por exemplo, /Shared Documents/Dana) usando n8n.

O que fiz

  1. Nó Microsoft SharePoint → Resource: Item → Operation: Get Many

    • Isso retorna itens com sucesso.
    • Também filtrei para a pasta (então quero apenas arquivos em /Dana).
  2. Então faço um loop nos resultados usando Loop Over Items / Split In Batches e tento:

    • Nó Microsoft SharePoint → Resource: File → Operation: Download
    • Mas o nó só suporta “By ID” (sem opção “By path” na minha versão), então preciso de um ID de arquivo.

O que vejo na saída “Get Many Items”

Cada registro retornado tem campos como:

  • id: 1 (parece ser um id de item da lista)
  • webUrl: https://.../Shared%20Documents/Dana/sample.txt
  • contentType.id: 0x0120... (tipo de conteúdo)
  • parentReference.id: c5c59b33-8fc3-44a5-915f-9c608c03731c
  • parentReference.siteId: elbitsystems.sharepoint.com,0f496d07-...,303451ee-...
  • parentReference.listId: ecc55e50-...

O problema

Quando tento baixar usando o nó SharePoint File → Download:

  • Passar webUrl falha (esperava ID)
  • Passar id falha (parece ser id de item da lista, não id de arquivo/driveItem)
  • Passar contentType.id falha (não é um id de arquivo)
  • Passar parentReference.id falha (parece ser id da pasta pai)

Sempre recebo:

  • 400 Bad request – please check your parameters

Com o que preciso de ajuda

  • Como obtenho o ID correto do arquivo/driveItem da saída “Get Many Items (Item resource)” para poder usá-lo em File → Download?
  • Ou qual é o fluxo de trabalho recomendado no n8n para baixar todos os arquivos de uma pasta:
    • Devo usar um recurso diferente do SharePoint (File em vez de Item)?
    • Ou devo usar um nó HTTP Request com Microsoft Graph para baixar por caminho?

Versão n8n: 2.18.7 (auto-hospedado)
Nó: n8n-nodes-base.microsoftSharePoint (mais recente mostrado na interface)

Oi @dana_bida

Em vez de usar o recurso “Item” para encontrar seus arquivos, use o recurso “File”. Isso garante que os IDs retornados sejam compatíveis com a operação Download.

  1. Substitua seu primeiro nó:
    • Resource: File
    • Operation: List
  2. Configure a Pasta:
    • Na operação “List”, você pode especificar o caminho ou ID da pasta. Como você quer /Shared Documents/Dana, certifique-se de que está direcionando para essa pasta específica.
  3. A Saída:
    • O id retornado por Resource: FileOperation: List é o DriveItem ID.
  4. O Nó Download:
    • Passe esse id diretamente para Resource: FileOperation: Download. Isso vai resolver o erro 400 Bad Request.

Se a operação “File → List” integrada não lhe der a filtragem exata que você precisa, você pode usar a API do Microsoft Graph diretamente. Isso geralmente é mais confiável para estruturas de pastas profundas.

Passo 1: Liste os arquivos na pasta Use um nó HTTP Request:

  • Method: GET
  • URL: https://graph.microsoft.com/v1.0/sites/{{siteId}}/drive/root:/Shared Documents/Dana:/children
    • (Substitua {{siteId}} por seu site ID ou use o formato de hostname/caminho do site).
  • Authentication: Use as mesmas credenciais do SharePoint/Microsoft.

Passo 2: Loop e Download A resposta vai conter um array value. Cada objeto nesse array tem um campo id. Esse id é o driveItemId.

  • Passe esse id para seu nó Microsoft SharePointResource: FileOperation: Download já existente.

Isso ajuda?

@dana_bida a id de Item → Get Many é a list-item id, mas Download quer a driveItem id, daí seu 400. A solução mais fácil é pular o nó download inteiro, a chamada Graph children já te passa um link de download pré-assinado por arquivo, então é só fazer um GET nesse link, sem id juggling:

troca SITE_ID pela parentReference.siteId que você já vê no seu output, reutiliza sua credencial SharePoint OAuth existente no primeiro nó, e deixa a autenticação do nó download como None já que a url já é pré-assinada. se esse link de download vier vazio alguma hora (app-only auth faz isso), aponta esse nó pra /sites/SITE_ID/drive/items/{{ $json.id }}/content com sua credencial anexada no lugar.

depois de obter a lista de arquivos, adicione um nó Filter na resposta do arquivo existente (ou seja, {{ $json.file }} não está vazio) para excluir automaticamente subpastas do seu loop; caso contrário, a etapa de download falhará nos itens de pasta que se infiltrarem na resposta children.