One trigger multiple google sheets?

Hi everyone,

I have 10 Google Sheets (one dashboard per client) and I want one single workflow to trigger whenever any row in any of them is updated.

I want to avoid duplicating the workflow 10 times with 10 separate Google Sheets Triggers.

Questions:

  • Is there a native n8n way to listen to multiple Sheets in one trigger?

  • Anyone solved this multi-tenant Sheets → single workflow pattern in production?

Thanks :folded_hands:

@Mohamed_Necib4 no native way — Google Sheets Trigger is one-doc-per-node. Cleanest pattern: 10 tiny “trigger only” workflows, each firing Execute Workflow into one main workflow.

Duplicate per client, swap SHEETID, point all at same MAINID.

Ok thank you for your help.

Perhaps you can try this. You need two pieces of code: the n8n Workflow JSON (which you import into n8n) and the Google Apps Script (which you paste into each Google Sheet).

1. The n8n Workflow JSON

Copy the code block below. In n8n, simply create a new workflow and paste (Ctrl+V / Cmd+V) this JSON directly onto the canvas.

Important Setup for the JSON:

  1. Credentials: After pasting, double-click the “Get Updated Row” node and select your own Google Sheets OAuth2 credentials.

  2. Webhook URL: Once you activate the workflow, copy the Production URL from the Webhook node. You will need this for the script below.

2. The Google Apps Script

You must add this to each of your 10 client sheets.

  1. Open your Google Sheet ->-> Extensions ->-> Apps Script.

  2. Delete any existing code and paste the following:

// REPLACE THIS with your n8n Production Webhook URL
const N8N_WEBHOOK_URL = "https://your-n8n-instance.com/webhook/google-sheets-multi-tenant";

function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();
  const spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
  
  // Prepare the data to send to n8n
  const payload = {
    spreadsheetId: spreadsheetId,
    sheetName: sheet.getName(),
    row: range.getRow(),
    column: range.getColumn(),
    newValue: e.value,
    oldValue: e.oldValue,
    user: Session.getActiveUser().getEmail()
  };

  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    UrlFetchApp.fetch(N8N_WEBHOOK_URL, options);
  } catch (err) {
    console.log("Error sending to n8n: " + err);
  }
}

How it works in production:

  1. User edits a cell in any of the 10 sheets.

  2. Google Apps Script instantly triggers and sends the spreadsheetId and row number to n8n.

  3. n8n Webhook receives the request.

  4. n8n Google Sheets Node uses the spreadsheetId from the payload to dynamically connect to that specific client’s file and pull the full row data.

  5. Single Workflow handles every client, no matter how many sheets you add in the future.

Does that help?