Elizon Docs
Workflows

Google Drive

Upload, download, list, search, move, rename, delete and share files as a connected Google account.

The Google Drive app works with files in a connected Google account.

The one thing to understand first

Elizon asks Google for the narrowest Drive permission that exists: it can work with files Elizon itself created, and with files you hand it explicitly. It cannot see the rest of your Drive, and that is deliberate — the permission that can is one Google classifies as restricted, and asking for it would mean every Elizon deployment holding the keys to every file in every connected account.

So the rule is:

Drive steps can see what Elizon made. They cannot see what you made.

A folder you created in Drive yourself, and the files in it, are invisible to a Drive step. Google reports that as "File not found" rather than as "not allowed", which is misleading enough that Elizon adds the missing sentence to the error itself — if a Drive step says a file was not found and you are looking straight at it in your browser, this is why, and the id is not the problem.

How to work with it. Make Elizon the thing that creates the folder:

  1. Run Folder · Create a folder once, by hand, from the Run button in Studio.
  2. Copy the id it answers with.
  3. Paste that id into the Folder id field of every Drive step that should work in there.

From then on the folder and everything Elizon puts into it are visible to every Drive step in that account — including List files and Search files. You can open the folder in Drive, move things into it and share it like any other; a file you drag in yourself stays invisible to Elizon, but one Elizon wrote stays visible even after you move it.

If you genuinely need a workflow to read arbitrary existing files, use FTP / SFTP against a file server you control, or have the file sent in — a Form trigger upload or an Email trigger attachment — rather than fetched out of Drive.

What each operation is for

OperationWhat it does
File · Upload a filePuts a file from an earlier step, or some text, into Drive. Answers with its id.
File · Download a fileFetches a file's contents as a file the rest of the workflow can use.
File · List filesThe files Elizon can see, optionally inside one folder, filtered by name or type.
File · Search filesFull-text search across the files Elizon can see — contents as well as names.
File · Move a fileMoves it to another folder, and renames it in the same step if you want.
File · Rename a fileChanges the name, leaves it where it is.
File · Delete a filePermanent. Does not go to the trash. Deleting a folder deletes what is inside it.
Folder · Create a folderA new folder. Keep the id.
Sharing · Share a fileGives a person, a group, a domain, or anyone with the link access to one file.

Delete is permanent. Drive's API deletes rather than trashes, so there is nothing to restore from. The node is flagged as a step that cannot be undone, and if you want second thoughts, Move a file into a folder you treat as a trash can is the reversible version.

Sharing cannot transfer ownership. The roles on offer go up to full control in a shared drive; handing the file to someone else is a different, irreversible operation and is not one of them.

Downloading, and Google Docs

Download a file needs a file id, and nothing else:

{{ upstream.<nodeId>.output.file }}

is what it fills. result stays null, because the answer is the file.

A Google Doc, Sheet or Slides file has no contents to download — it only exists inside Google's editors. Elizon notices and exports instead, which is why there is nothing for you to set:

The file is aAutomatic gives youYou can also ask for
Google DocPDFWord, plain text
Google SheetExcelPDF, CSV (first sheet)
Google SlidesPDFPowerPoint, plain text

Leave Export Google Docs, Sheets and Slides as on Automatic unless a later step needs a particular format — an Excel file if something is going to read the numbers, a PDF if a person is going to read the document. Asking for a format a file cannot become (Word, for a spreadsheet) is refused before anything is fetched, and the message lists the ones that would have worked. Google caps an export at 10 MB; a long document that will not export is a document to split, not a setting to change.

Everything else — a PDF, an image, a ZIP, a .docx someone uploaded — is downloaded exactly as it is.

Uploading

Two things to choose: what to upload (a file from an earlier step, or text) and where (a folder id, or nothing for the account's My Drive root).

Leave Name in Drive empty to keep the name the file already has. Leave Content type empty unless Drive should treat the bytes as something other than what they are.

Anything that produces a file can feed it: a Convert to File, an HTTP Request set to download, an FTP download, a form upload, another Drive download.

Two worked examples with Drive

Drive download → AI Prompt. Summarise a document a Drive step fetched.

  1. Something supplies the file id — a List files or Search files step, a Data Table row, the trigger's payload. Say it is a Search files step called find.
  2. A Google Drive step called fetch, File · Download a file, with File id set to {{ upstream.find.output.result.0.id }}. Leave the export format on Automatic, so a Google Doc arrives as a PDF and a PDF arrives as itself.
  3. An AI Prompt step, with an Attachment row set to {{ upstream.fetch.output.file }} and a prompt that says what to do with it — "Summarise this service report in five bullet points, and say whether it recommends a follow-up visit."

The attachment row takes the file reference as-is. Nothing is pasted into the prompt and nothing is re-read from Drive: the model is handed the file the download already stored.

Convert to File → Drive upload. Put a generated report where a person will look for it.

  1. Whatever the run produced — an AI Prompt answer, a Data Table query, an Edit Fields object.
  2. A Convert to File step called report, format PDF, with the content you want in it.
  3. A Google Drive step, File · Upload a file:
    • What to upload — A file from an earlier step
    • File (Expression) — {{ upstream.report.output.file }}
    • Name in Drive (Expression) — Service report {{ trigger.body.order_number }}.pdf
    • Folder id — the id of the folder you created in step 1 of "How to work with it" above
  4. Optionally a Sharing · Share a file step, One person / View it, with File id set to {{ upstream.<uploadNodeId>.output.result.id }} and the address of whoever should see it.

The upload answers with the file's id and its webViewLink, so a following Send Email can link straight to it rather than attaching the file a second time.

The New file in a folder trigger remembers the creation time of the newest file it has fired for: a file whose creation time is older than that is never fired for. See What "new" means.

Operations

The App step's own settings — account, resource, operation, and { value, valueMode } per input — are described in the Apps overview. These are this app's operations.

OperationWhat it doesInputs (bold = required)Permission
file.uploadUpload a filefilename, source, attachment, text, contentType, folderId—
file.downloadDownload a filefileId, filename, exportAs—
file.listList filesfolderId, nameContains, mimeType, includeTrashed—
file.searchSearch filestext, folderId, includeTrashed—
file.moveMove a filefileId, folderId, name—
file.renameRename a filefileId, name—
file.deleteDelete a file. Cannot be undone.fileId—
folder.createCreate a foldername, folderId—
permission.shareShare a file. Cannot be undone.fileId, type, role, emailAddress, domain, sendNotificationEmail—

Triggers

Use these on an App trigger node. It polls every pollMinutes and starts one run per new item.

TriggerFires forInputs (bold = required)
file-addedNew file in a folder — Fires once for every file that appears in one folder, with the file itself attached.folderId, mimeType

Example

workflows/save-summary.yaml
name: Save summary
description: Saves a summary as a text file in Drive.
graph:
  nodes:
    - id: start
      type: trigger_manual
      position: { x: 0, y: 0 }
      data: { description: 'Pass summary.' }
    - id: upload
      type: app
      position: { x: 280, y: 0 }
      data:
        app: google-drive
        version: 1.0.0
        resource: file
        operation: upload
        connection: google-account
        inputs:
          source: { value: 'text', valueMode: fixed }
          text: { value: '{{ trigger.summary }}', valueMode: expression }
          filename: { value: 'Summary.txt', valueMode: fixed }
          folderId: { value: '1FolderIdElizonCreated', valueMode: fixed }
  edges:
    - { id: start-to-upload, source: start, target: upload }

In a Package

The step travels whole; the account becomes a credential Slot the installer binds one of their own Google accounts to. See Apps in a Package.

elizon.yaml
slots:
  - id: google-account
    type: credential
    scheme: oauth2
    app: google
compliance:
  providers: [google]
  • Travels: app, version, resource, operation, inputs
  • Converted: connectionId → connection (the credential Slot)
  • Never carried: none