Apps Script lets you create charts programmatically using sheet.newChart() and the EmbeddedChartBuilder API. You can build bar charts, pie charts, line charts, and more — all driven from your spreadsheet data.
Creating a Bar Chart of Deals by Region
This example builds a bar chart from a summary table on a Dashboard sheet showing the number of deals per region:
function createDealsByRegionChart() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Build a summary table on the Dashboard sheet
var dataSheet = ss.getSheetByName("Sales Tracker");
var dashboard = ss.getSheetByName("Dashboard") || ss.insertSheet("Dashboard");
var data = dataSheet.getRange(2, 1, dataSheet.getLastRow() - 1, 7).getValues();
// Columns: [Customer Name, Email, Product, Amount, Region, Sales Rep, Status]
var regionCounts = {};
data.forEach(function(row) {
var region = row[4];
if (!region) return;
regionCounts[region] = (regionCounts[region] || 0) + 1;
});
// Write summary to Dashboard
dashboard.getRange("A1").setValue("Region");
dashboard.getRange("B1").setValue("Deals");
var summaryRow = 2;
Object.keys(regionCounts).forEach(function(region) {
dashboard.getRange(summaryRow, 1).setValue(region);
dashboard.getRange(summaryRow, 2).setValue(regionCounts[region]);
summaryRow++;
});
// Build the chart
var chartRange = dashboard.getRange(1, 1, summaryRow - 1, 2);
var chart = dashboard.newChart()
.setChartType(Charts.ChartType.BAR)
.addRange(chartRange)
.setPosition(2, 4, 0, 0)
.setOption("title", "Deals by Region")
.setOption("hAxis.title", "Number of Deals")
.setOption("vAxis.title", "Region")
.setOption("width", 500)
.setOption("height", 300)
.build();
dashboard.insertChart(chart);
Logger.log("Bar chart created.");
}Creating a Pie Chart of Revenue by Product
function createRevenueByProductChart() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = ss.getSheetByName("Sales Tracker");
var dashboard = ss.getSheetByName("Dashboard") || ss.insertSheet("Dashboard");
var data = dataSheet.getRange(2, 1, dataSheet.getLastRow() - 1, 8).getValues();
var productRevenue = {};
data.forEach(function(row) {
var product = row[2];
var amount = row[3];
var status = row[6];
if (status !== "Closed" || !product) return;
productRevenue[product] = (productRevenue[product] || 0) + amount;
});
// Write summary starting at column D
dashboard.getRange("D1").setValue("Product");
dashboard.getRange("E1").setValue("Revenue");
var row = 2;
Object.keys(productRevenue).forEach(function(product) {
dashboard.getRange(row, 4).setValue(product);
dashboard.getRange(row, 5).setValue(productRevenue[product]);
row++;
});
var chartRange = dashboard.getRange(1, 4, row - 1, 2);
var chart = dashboard.newChart()
.setChartType(Charts.ChartType.PIE)
.addRange(chartRange)
.setPosition(2, 8, 0, 0)
.setOption("title", "Revenue by Product (Closed Deals)")
.setOption("width", 450)
.setOption("height", 300)
.build();
dashboard.insertChart(chart);
Logger.log("Pie chart created.");
}With the sample data, Starter Plan ($99), Pro Plan ($299), and Enterprise Plan ($0 — not closed) appear as slices.
Creating a Line Chart of Deals Over Time
function createDealsOverTimeChart() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = ss.getSheetByName("Sales Tracker");
var dashboard = ss.getSheetByName("Dashboard") || ss.insertSheet("Dashboard");
// Write date-based summary to columns G–H
var data = dataSheet.getRange(2, 1, dataSheet.getLastRow() - 1, 8).getValues();
var dateCounts = {};
data.forEach(function(row) {
if (row[6] !== "Closed" || !row[7]) return;
var dateStr = Utilities.formatDate(new Date(row[7]), Session.getScriptTimeZone(), "MMM dd");
dateCounts[dateStr] = (dateCounts[dateStr] || 0) + 1;
});
dashboard.getRange("G1").setValue("Date");
dashboard.getRange("H1").setValue("Closed Deals");
var r = 2;
Object.keys(dateCounts).forEach(function(d) {
dashboard.getRange(r, 7).setValue(d);
dashboard.getRange(r, 8).setValue(dateCounts[d]);
r++;
});
var chartRange = dashboard.getRange(1, 7, r - 1, 2);
var chart = dashboard.newChart()
.setChartType(Charts.ChartType.LINE)
.addRange(chartRange)
.setPosition(14, 4, 0, 0)
.setOption("title", "Closed Deals Over Time")
.setOption("width", 500)
.setOption("height", 300)
.build();
dashboard.insertChart(chart);
Logger.log("Line chart created.");
}Deleting All Charts from a Sheet
function clearAllCharts() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard");
sheet.getCharts().forEach(function(chart) {
sheet.removeChart(chart);
});
Logger.log("All charts removed.");
}