Skip to content

All free automations

Form auto-reply and lead tracker

When someone submits a Google Form, they get a reply and the row is marked Replied.

What the sheet looks like

TimestampNameEmailMessageStatus
2026-10-25 09:00Ana Popana@example.comI need a booking pageReplied

Setup, about 5 minutes

  1. Link the form to a sheet. The form must collect email, or include a question named Email.
  2. Open Extensions > Apps Script and paste the code.
  3. Add an installable trigger: On form submit, function onFormSubmit.
  4. Allow Gmail the first time it runs.
  5. Send a test response. The sheet shows Status = Replied.

Apps Script

/**
 * Form submit -> branded auto-reply -> Status column.
 * Use an installable trigger: Forms -> On form submit -> onFormSubmit.
 * The form must collect email addresses, or have a column named Email or Email Address.
 */
function onFormSubmit(e) {
  if (!e || !e.range) throw new Error('Run this from the form submit trigger.');
  var sheet = e.range.getSheet();
  var width = Math.max(sheet.getLastColumn(), e.range.getNumColumns());
  var headers = sheet.getRange(1, 1, 1, width).getValues()[0].map(function (h) { return String(h).trim(); });
  var values = sheet.getRange(e.range.getRow(), 1, 1, width).getValues()[0];
  var status = ensureStatus_(sheet, headers);
  headers = status.headers;
  var email = emailFrom_(headers, values);
  if (!email) throw new Error('No email on this response.');
  var name = named_(headers, values, ['Name', 'Nume']) || 'there';
  var lines = [];
  for (var i = 0; i < headers.length; i++) {
    if (!headers[i] || headers[i] === 'Status') continue;
    lines.push(headers[i] + ': ' + values[i]);
  }
  MailApp.sendEmail({
    to: email,
    subject: 'We received your message',
    body: 'Hello ' + name + ',\n\nWe received your message.\n\n' + lines.join('\n') + '\n'
  });
  sheet.getRange(e.range.getRow(), status.index + 1).setValue('Replied');
}

function ensureStatus_(sheet, headers) {
  for (var i = 0; i < headers.length; i++) {
    if (headers[i].toLowerCase() === 'status') return { headers: headers, index: i };
  }
  sheet.getRange(1, headers.length + 1).setValue('Status');
  headers.push('Status');
  return { headers: headers, index: headers.length - 1 };
}

function emailFrom_(headers, values) {
  var names = ['email', 'email address', 'e-mail'];
  for (var i = 0; i < headers.length; i++) {
    if (names.indexOf(headers[i].toLowerCase()) >= 0) return String(values[i] || '').trim();
  }
  return '';
}

function named_(headers, values, names) {
  for (var i = 0; i < headers.length; i++) {
    for (var n = 0; n < names.length; n++) {
      if (headers[i].toLowerCase() === names[n].toLowerCase()) return String(values[i] || '').trim();
    }
  }
  return '';
}

Guide: how to use the free templates