A board deck built on $4.2M closed ARR is accurate the moment you paste it. Six weeks later, when the pipeline has moved and the board is asking questions, that number is archaeology. The problem isn't the data - it's keeping it live.
Formula-Based Refresh in Google Sheets
IMPORTDATA, IMPORTRANGE, and IMPORTFEED all refresh automatically without any code. According to Google's Sheets documentation, IMPORT functions refresh approximately every 60 minutes, with a hard rate limit of 100 requests per 10 seconds across all users on the same spreadsheet. You can push a re-evaluation by appending a volatile cell reference as a dummy parameter, but the underlying cache still updates at Google's discretion.
The real limitation: IMPORT functions are fetch-only. They pull raw data into a flat range and stop there. They can't reshape a 1,200-row CRM export into a contribution margin table by SKU, and they can't route data to the right tab in an 8-tab model based on any conditional logic. If the source API changes column order, your downstream SUMIFS breaks silently.
For cross-tab work against imported data:
=SUMIFS('CRM Import'!D:D,'CRM Import'!C:C,">="&Assumptions!$B$3,'CRM Import'!B:B,"Closed Won")
This holds as long as the import schema doesn't shift. It references. It doesn't interpret.
Apps Script Time Triggers in Google Sheets
Apps Script time-based triggers can run a function on a schedule as frequent as every minute. According to Google's Apps Script quotas table, each script execution is limited to 6 minutes, while Google Workspace accounts get 6 hours of aggregate trigger runtime per day. You're limited to 20 triggers per user per script.
A basic hourly pipeline refresh looks like this:
function setupRefreshTrigger() {
// Creates an hourly installable trigger for refreshPipeline
ScriptApp.newTrigger('refreshPipeline')
.timeBased()
.everyHours(1)
.create();
}
function refreshPipeline() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Pipeline');
// Replace with your CRM or data API endpoint
var response = UrlFetchApp.fetch('https://your-crm.internal/api/deals?stage=open');
var data = JSON.parse(response.getContentText());
// Map API fields to: name, stage, ARR, close date
var rows = data.deals.map(function(d) {
return [d.name, d.stage, d.arr_value, d.close_date];
});
// Start at row 2 to preserve the header row
sheet.getRange(2, 1, rows.length, 4).setValues(rows);
}
This is the most flexible option short of a full data pipeline. You can reshape data, route it across tabs, trigger conditional alerts, and run post-write calculations. The tradeoff is maintenance: API changes are your problem, silent failures are your problem, and quota is shared across all scripts in your account.
One collision risk worth noting: if your trigger fires every hour and a 1,340-row write takes 4 minutes, and another trigger fires mid-write, you can end up with partial data and no error in the execution log. Test write timing against trigger interval before running it in a production board pack model.
Scheduled AI Refresh in Google Sheets
The two approaches above handle data movement. What they can't do is interpret, summarize, or contextually transform data as it arrives. That's the gap scheduled AI tools fill.
As of June 2026, tools like ModelMonkey can connect to sources like HubSpot, Stripe, or Google Analytics and write structured results directly into your sheet on a schedule. The difference from Apps Script: you describe the output in plain language ("get deals closed this quarter, group by region, compare to prior quarter") and the AI builds and executes the query rather than you maintaining a brittle fetch script.
A scheduled AI tool's auto-refresh might cover a scenario like this: your 18-month runway model has a "New Hires" tab pulling headcount from your HRIS. The AI pulls fresh headcount weekly, recalculates loaded cost assumptions against the Compensation tab, and flags when burn rate has drifted more than 14% from the last board review. That reasoning chain - interpret, route, flag - isn't something a formula or a raw fetch script does on its own.
The limitations are real: these tools charge per request, they're constrained to the source integrations they support, and a $127M revenue projection model with custom WACC assumptions still needs a human to wire the logic initially. Don't expect the AI to infer your methodology cold.
Which Approach to Use for AI Refresh in Google Sheets
In summary, here's how the options compare across the dimensions that matter in a real model:
| Approach | Refresh Cadence | Transformation Power | Maintenance | Best For |
|---|---|---|---|---|
| IMPORT formulas | ~60 min (auto) | Fetch only | None | Simple live feeds |
| Apps Script triggers | Configurable (min: 1 min) | Full programmatic | High | Custom API integrations |
| Scheduled AI tool | Configurable | Natural language reasoning | Low | Multi-source, interpreted data |
| Manual copy-paste | On demand | Unlimited | Highest | One-off pulls, sensitive data |
For a quarterly board pack pulling from 3 sources across 8 tabs, Apps Script or a scheduled AI tool is the right call. IMPORT formulas won't reshape data intelligently, and manual paste will fail you when someone asks for a re-run at 11pm before a 9am board meeting.
For a contribution margin analysis by SKU where the source is already in Sheets and you just need it current, IMPORTRANGE plus SUMIFS is clean and fast.
The real decision point is whether your refresh needs interpretation. If you need incoming data understood, routed to the right tab, and compared against existing model assumptions, you need more than an IMPORT formula.
Try ModelMonkey free for 14 days - it works in both Google Sheets and Excel.