Spreadsheet cells that enrich the web.

Install one Apps Script file in 30 seconds to call all 14 public @lucacelli Apify Store actors directly from Google Sheets using your $5.00 monthly credit.

Download Google Sheets Script (.gs)
Google Sheets 3D Matrix Sculpture
Domain Contact and Tech Stack Formula

Domain Contact & Tech Stack

=LUCACELLI_ENRICH(A2)

Returns verified emails, phone numbers, detected SaaS stack, and SPF security status for the domain in cell A2 ($0.50/1k).

Google Maps Lead Table Formula

Google Maps Lead Table

=LUCACELLI_GMAPS("dentists in turkey", 10)

Populates multi-row business names, phone numbers, websites, ratings, and street addresses directly into your sheet ($1.50/1k).

Shopify and WordPress Spy Formula

Shopify & WordPress Spy

=LUCACELLI_SHOPIFY(A2)

Extracts Shopify product counts, average pricing, or WordPress theme and plugin detections ($0.80/1k).

Technical SEO and Schema Audit Formula

Technical SEO & Schema Audit

=LUCACELLI_SEO(A2)

Audits any URL for HTTP status, title length, word count, Schema.org types, and broken links ($0.50/1k).

Thirty-second setup in Google Sheets.

Open any Google Sheet, choose Extensions > Apps Script, paste the code below into Code.gs, and save.

/**
 * ============================================================================
 * LUCACELLI B2B CLOUD — GOOGLE SHEETS™ CUSTOM FORMULAS & SIDEBAR ADD-ON
 * ============================================================================
 * Powered by https://apify.com/lucacelli (Includes $5.00/Month Free Apify Credit)
 * Transparent Single-Event Pricing ($0.50 - $1.50 per 1,000 results).
 *
 * HOW TO INSTALL IN 30 SECONDS:
 * 1. Open any Google Sheet -> Extensions -> Apps Script.
 * 2. Paste this entire file into Code.gs and click Save (Ctrl+S).
 * 3. Reload your Google Sheet -> Click " Lucacelli B2B Cloud" -> "Set Apify API Token".
 * 4. Use formulas in any cell:
 *    =LUCACELLI_ENRICH("stripe.com")
 *    =LUCACELLI_SEO("https://stripe.com")
 *    =LUCACELLI_WP_SPY("techcrunch.com")
 *    =LUCACELLI_SHOPIFY("gymshark.com")
 *    =LUCACELLI_GMAPS("dentists in Austin TX", 5)
 */

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu(' Lucacelli B2B Cloud')
    .addItem(' Set Free Apify API Token ($5/Mo Credit)', 'setLucacelliApiToken')
    .addItem(' Enrich Selected Domain Cells', 'enrichSelectedRows')
    .addSeparator()
    .addItem(' Open @lucacelli Apify Store (14 Live Actors)', 'openStoreInfo')
    .addToUi();
}

function setLucacelliApiToken() {
  var ui = SpreadsheetApp.getUi();
  var res = ui.prompt(
    'Lucacelli B2B Cloud — Set Apify API Token',
    'Paste your Apify API token (apify_api_...). Every free Apify account includes $5.00/month in renewable credit (https://console.apify.com/settings/integrations):',
    ui.ButtonSet.OK_CANCEL
  );
  if (res.getSelectedButton() === ui.Button.OK) {
    PropertiesService.getUserProperties().setProperty('LUCACELLI_APIFY_TOKEN', res.getResponseText().trim());
    ui.alert(' Apify Token saved! You can now use =LUCACELLI_ENRICH(A2), =LUCACELLI_GMAPS(), =LUCACELLI_SEO(), etc.');
  }
}

function openStoreInfo() {
  SpreadsheetApp.getUi().alert('Visit https://apify.com/lucacelli to view all 14 Public B2B & AI Actors.');
}

function callLucacelliActor_(actorSlug, payload, tokenOverride) {
  var token = tokenOverride || PropertiesService.getUserProperties().getProperty('LUCACELLI_APIFY_TOKEN');
  if (!token) {
    return [['ERROR: Click " Lucacelli B2B Cloud -> Set Free Apify API Token" or pass token as 2nd parameter']];
  }
  var url = 'https://api.apify.com/v2/acts/lucacelli~' + encodeURIComponent(actorSlug) + '/run-sync-get-dataset-items?token=' + encodeURIComponent(token);
  var res = UrlFetchApp.fetch(url, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });
  return JSON.parse(res.getContentText());
}

/**
 * Enriches a domain with Emails, Phones, Social Profiles, SPF & Tech Stack ($0.50/1k).
 * @param {string} domain The domain to enrich (e.g. "stripe.com").
 * @param {string} apiToken Optional Apify API token override.
 * @return Horizontal row: [Emails, Phones, Tech Stack, SPF Status, Title]
 * @customfunction
 */
function LUCACELLI_ENRICH(domain, apiToken) {
  if (!domain) return '';
  var clean = String(domain).replace(/^https?:\/\//i, '').split('/')[0].trim();
  var items = callLucacelliActor_('b2b-domain-contact-tech-enricher', { domains: [clean] }, apiToken);
  if (!Array.isArray(items) || !items.length || !items[0].domain) return items;
  var r = items[0];
  return [[
    (r.emails || []).join(', '),
    (r.phones || []).join(', '),
    (r.technologies || r.techStack || []).join(', '),
    r.hasSpf ? 'SPF Valid' : 'No SPF',
    r.title || ''
  ]];
}

/**
 * Audits a URL for Technical SEO, Broken Links, Schema.org & Security Headers ($0.50/1k).
 * @param {string} url The webpage URL (e.g. "https://stripe.com").
 * @param {string} apiToken Optional Apify API token override.
 * @return Horizontal row: [SEO Score/Status, Title, Word Count, Schema Types, Broken Links]
 * @customfunction
 */
function LUCACELLI_SEO(url, apiToken) {
  if (!url) return '';
  var clean = String(url).trim();
  if (clean.indexOf('http') !== 0) clean = 'https://' + clean;
  var items = callLucacelliActor_('seo-technical-audit-broken-link-schema-analyzer', { urls: [clean] }, apiToken);
  if (!Array.isArray(items) || !items.length) return items;
  var r = items[0];
  return [[
    r.seoScore || r.statusCode || 200,
    r.title || '',
    r.wordCount || 0,
    (r.schemaTypes || []).join(', '),
    r.brokenLinksCount || 0
  ]];
}

/**
 * Detects WordPress Themes, Plugins & WooCommerce Store Signals ($0.80/1k).
 * @param {string} domain Domain to inspect (e.g. "techcrunch.com").
 * @param {string} apiToken Optional Apify API token override.
 * @return Horizontal row: [Is WordPress, Theme, Detected Plugins, Is WooCommerce]
 * @customfunction
 */
function LUCACELLI_WP_SPY(domain, apiToken) {
  if (!domain) return '';
  var clean = String(domain).replace(/^https?:\/\//i, '').split('/')[0].trim();
  var items = callLucacelliActor_('wordpress-woocommerce-site-spy', { domains: [clean] }, apiToken);
  if (!Array.isArray(items) || !items.length) return items;
  var r = items[0];
  return [[
    Boolean(r.isWordPress),
    r.themeName || r.theme || 'N/A',
    (r.plugins || []).join(', '),
    Boolean(r.isWooCommerce)
  ]];
}

/**
 * Extracts Shopify Store Products, Prices, Stock & Merchant Contacts ($0.80/1k).
 * @param {string} domain Shopify store domain (e.g. "gymshark.com").
 * @param {string} apiToken Optional Apify API token override.
 * @return Horizontal row: [Store Title, Product Count, Average Price, Sample Products]
 * @customfunction
 */
function LUCACELLI_SHOPIFY(domain, apiToken) {
  if (!domain) return '';
  var clean = String(domain).replace(/^https?:\/\//i, '').split('/')[0].trim();
  var items = callLucacelliActor_('shopify-store-product-contact-spy', { domains: [clean], maxProductsPerStore: 5 }, apiToken);
  if (!Array.isArray(items) || !items.length) return items;
  var r = items[0];
  return [[
    r.storeName || r.domain || clean,
    r.productCount || items.length,
    r.averagePrice || r.price || '',
    r.title || (r.products ? r.products.map(function(p){return p.title;}).join('; ') : '')
  ]];
}

/**
 * Scrapes Google Maps Places, Emails, Phone Numbers & Reviews directly into rows ($1.50/1k).
 * @param {string} query Search query (e.g. "dentists in Austin TX").
 * @param {number} maxResults Number of leads to return (default 5).
 * @param {string} apiToken Optional Apify API token override.
 * @return Multi-row table of [Title, Phone, Email/Website, Rating, Address]
 * @customfunction
 */
function LUCACELLI_GMAPS(query, maxResults, apiToken) {
  if (!query) return '';
  var items = callLucacelliActor_('google-maps-scraper-places-emails-contacts-reviews', {
    queries: [String(query)],
    maxResultsPerQuery: Number(maxResults) || 5
  }, apiToken);
  if (!Array.isArray(items) || !items.length) return items;
  var rows = [['Business Name', 'Phone', 'Website / Email', 'Rating', 'Address']];
  for (var i = 0; i < items.length; i++) {
    var x = items[i];
    rows.push([
      x.title || x.name || '',
      x.phone || '',
      (x.emails && x.emails.length ? x.emails.join(', ') : (x.website || '')),
      x.rating || x.totalScore || '',
      x.address || ''
    ]);
  }
  return rows;
}

function enrichSelectedRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var values = range.getValues();
  var domains = [];
  for (var i = 0; i < values.length; i++) {
    if (values[i][0]) domains.push(String(values[i][0]).replace(/^https?:\/\//i, '').split('/')[0].trim());
  }
  if (!domains.length) return;
  var items = callLucacelliActor_('b2b-domain-contact-tech-enricher', { domains: domains });
  if (!Array.isArray(items)) return;
  var startRow = range.getRow();
  var startCol = range.getColumn() + 1;
  for (var j = 0; j < items.length; j++) {
    var r = items[j];
    sheet.getRange(startRow + j, startCol, 1, 4).setValues([[
      (r.emails || []).join(', '),
      (r.phones || []).join(', '),
      (r.technologies || r.techStack || []).join(', '),
      r.hasSpf ? 'SPF Valid' : 'No SPF'
    ]]);
  }
}