Technical Issue: Pie Chart Slice "Distance from Center" and "Color" not updating via Apps Script

55 views
Skip to first unread message

Almino

unread,
Apr 6, 2026, 7:32:29 PM (yesterday) Apr 6
to Google Apps Script Community

Hello,

I am seeking help regarding a consistent technical issue with Pie Charts in Google Sheets when using Apps Script.

The Problem: When I try to programmatically update a Pie Chart, some visual elements update correctly (like the Chart Title and Donut Hole size), but other elements remain unchanged in the UI.

Specifically, the following options do not render visually:

  1. Distance from center (offset): The slice does not move/explode from the center.

  2. Slice Color: The specific color applied to a slice is ignored, and it keeps the default theme color.

Observations:

  • This is not a script error, as other properties (like the title) change successfully during the same execution.

  • Manual adjustments through the Chart Editor work perfectly, which suggests the issue is related to how the API handles the "slices" configuration object.

  • I have tried refreshing the page and clearing the cache, but the visual state of the slices remains stuck.

Has anyone encountered this behavior where only specific chart properties fail to sync with the UI? Is there a known workaround for forcing the chart to redraw these specific slice attributes?

Thank you for your time and assistance.

Mario Rossi

unread,
Apr 6, 2026, 7:32:57 PM (yesterday) Apr 6
to google-apps-sc...@googlegroups.com
Hi — grazie per la descrizione chiara. Riassumo soluzioni pratiche e workarounds che funzionano quando le proprietà "slices" del grafico (colore e offset) non si riflettono nell'interfaccia dopo aggiornamento via Apps Script.
  1. Limite noto dell'EmbeddedChartBuilder
  • L'API di SpreadsheetApp/EmbeddedChartBuilder non sempre applica tutte le proprietà dei singoli slice (colore/offset) nella UI. Titolo e donut hole si aggiornano quasi sempre, ma alcune impostazioni sui slice possono rimanere "bloccate".
  1. Soluzione raccomandata: usare l'API REST di Sheets (Advanced Service)
  • Usa Sheets API (Spreadsheet API v4, metodo spreadsheets.batchUpdate) per aggiornare direttamente chartSpec.pieChart.slices. Questo è più affidabile per le proprietà dei slice.
  • Esempio di flusso: abilitare Advanced Sheets Service (o chiamare REST), costruire una richiesta UpdateEmbeddedChartRequest con chartId e il chartSpec aggiornato, quindi inviare batchUpdate.
  1. Workaround più semplice se non vuoi l'Advanced Service
  • Ricrea il grafico: leggi il grafico esistente, rimuovilo e inserisci un nuovo grafico con le impostazioni desiderate. A volte forzare la ricreazione fa aggiornare i slice.
  • Dopo modifiche via script, chiamare SpreadsheetApp.flush() e ricaricare la pagina del browser può aiutare ma non è sempre sufficiente.
  1. Possibili cause aggiuntive
  • Tema del foglio o colori del tema possono sovrascrivere i colori dei slice; prova a impostare colori espliciti via Sheets API.
  • Bug/ritardo di sincronizzazione lato client: in alcuni casi la UI resta con lo stato vecchio fino a ricreazione del grafico.
Se vuoi, posso:
  • Fornirti uno snippet pronto che usa Advanced Sheets Service (batchUpdate) per aggiornare colori e offset: ho però bisogno del spreadsheetId e chartId (o copia del chartSpec).
  • Aiutarti a creare lo script che rimuove e ricrea il grafico mantenendo tutti gli altri parametri.
Dimmi quale preferisci e ti preparo il codice.

Almino

unread,
Apr 6, 2026, 8:06:51 PM (yesterday) Apr 6
to Google Apps Script Community

  1. Soluzione raccomandata: usare l'API REST di Sheets (Advanced Service)
  • Usa Sheets API (Spreadsheet API v4, metodo spreadsheets.batchUpdate) per aggiornare direttamente chartSpec.pieChart.slices. Questo è più affidabile per le proprietà dei slice.
  • Esempio di flusso: abilitare Advanced Sheets Service (o chiamare REST), costruire una richiesta UpdateEmbeddedChartRequest con chartId e il chartSpec aggiornato, quindi inviare batchUpdate.
вівторок, 7 квітня 2026 р. о 02:32:57 UTC+3 Mario Rossi пише:

Mario Rossi

unread,
Apr 6, 2026, 8:07:14 PM (yesterday) Apr 6
to google-apps-sc...@googlegroups.com
Ciao Almino — grazie per il riepilogo chiaro e le soluzioni indicate.

Posso preparare subito il codice: dimmi quale opzione preferisci
  1. Snippet con Sheets Advanced Service (spreadsheets.batchUpdate) — più affidabile per slices;
  2. Script che legge, rimuove e ricrea il grafico (nessun Advanced Service);
  3. Analisi più approfondita se preferisci che verifichi il chartSpec esatto.
Se scegli l'opzione 1, forniscimi spreadsheetId e chartId (o una copia del chartSpec). Nota: dovrai abilitare l'Advanced Sheets Service (o fornire credenziali per chiamare la REST API).
Se scegli l'opzione 2, dimmi se vuoi mantenere tutte le impostazioni attuali (dimensioni, posizione, serie, titoli) o solo colori/offset, così preparo il codice adeguato.

Dimmi quale preferisci e ti invio lo snippet pronto.

Almino

unread,
Apr 6, 2026, 11:15:37 PM (yesterday) Apr 6
to google-apps-sc...@googlegroups.com
Hi! Thank you for the detailed options. I prefer Option 2 (Read, Remove, and Recreate the chart) because I want to avoid enabling Advanced Services if possible.

To help you prepare the exact code, here are my requirements:



1.Type: 3D Pie Chart (Donut style with pieHole: 0.4).

2.Data Range: A1:B3 (where A is Labels, B is Values).

3.Dynamic Settings: - I have settings in range E1:F3.

Column F contains a trigger (e.g., 1 for the Leader, 0.8 for others).

Column E contains the offset value (e.g., 0.25).

Behavior: The script should identify the row where Column F is 1, set that sector's color to Red (#FF0000) and apply the Offset from Column E. All other sectors should be Grey (#CCCCCC) with offset: 0.

Critical Fix: Please ensure the code includes .setOption('useFirstRowAsHeaders', true), as the chart tends to lose this setting during recreation.

Please provide a script that maintains the existing chart's position and size while applying these specific slice properties.

вт, 7 квіт. 2026 р. о 03:07 Mario Rossi <projectlaba...@gmail.com> пише:
--
You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/Lp_hFrAQ06w/unsubscribe.
To unsubscribe from this group and all its topics, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-apps-script-community/CACrgDdpjPggc8KwrQ2eH9ZfPToXVPMYjnQmzuSf%2Bs_W4uc_gtA%40mail.gmail.com.

Mario Rossi

unread,
Apr 6, 2026, 11:16:17 PM (yesterday) Apr 6
to google-apps-sc...@googlegroups.com
Ciao Almino — perfetto, procedo con l’opzione 2. Di seguito uno script che legge il grafico esistente, ne cattura posizione/dimensione, lo rimuove e lo ricrea come 3D Pie (donut pieHole:0.4) usando A1:B3 e applicando colore/offset dal range E1:F3. Include .setOption('useFirstRowAsHeaders', true) e mantiene la posizione/dimensione del chart originale.

Copia/incolla in Apps Script e assegna al foglio corretto il nomeSheet (o usa l'index). Se il foglio contiene più grafici potresti dover identificare quale chart usare (qui prende il primo).

Script:

function recreatePieWithSlices() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('Sheet1'); // modifica se serve
var charts = sheet.getCharts();
if (charts.length === 0) {
throw new Error('Nessun chart trovato sul foglio.');
}
var chart = charts; // se hai più chart, scegli l'indice corretto
var container = chart.getContainerInfo();
var anchorRow = container.getAnchorRow();
var anchorCol = container.getAnchorColumn();
var offsetX = container.getOffsetX();
var offsetY = container.getOffsetY();
var width = container.getWidth();
var height = container.getHeight();

// Legge impostazioni dinamiche E1:F3
var cfgRange = sheet.getRange('E1:F3').getValues();
// Prepara slices: default grey/0
var slices = {};
for (var i = 0; i < cfgRange.length; i++) {
var offset = parseFloat(cfgRange[i]) || 0; // colonna E
var trigger = parseFloat(cfgRange[i]) || 0; // colonna F
if (trigger === 1) {
slices[i] = { offset: offset, color: '#FF0000' };
} else {
slices[i] = { offset: 0, color: '#CCCCCC' };
}
}

// Rimuove il chart esistente
sheet.removeChart(chart);

// Ricrea il chart mantenendo posizione e dimensione
var builder = sheet.newChart()
.asPieChart()
.addRange(sheet.getRange('A1:B3'))
.setPosition(anchorRow, anchorCol, offsetX, offsetY)
.setOption('title', '') // mantieni o modifica se vuoi
.setOption('pieHole', 0.4)
.setOption('is3D', true)
.setOption('useFirstRowAsHeaders', true)
.setOption('slices', slices)
.setNumHeaders(1); // opzionale: assicura primo rigo come header

// Nota: setPosition definisce l'ancora; larghezza/altezza vengono applicate aggiustando il chart dopo l'inserimento
var newChart = builder.build();
sheet.insertChart(newChart);

// Applica larghezza/altezza (se necessario)
var allCharts = sheet.getCharts();
var inserted = allCharts[allCharts.length - 1];
var containerAfter = inserted.getContainerInfo();
// Alcune API non permettono setWidth/setHeight direttamente; se il builder non mantiene esattamente size,
// puoi ricreare con offsetX/offsetY e la dimensione verrà ereditata nella maggior parte dei casi.
// Se serve precisione assoluta usa Sheets Advanced Service (spreadsheets.batchUpdate).
}

Note importanti:
  • Il mapping slice usa l’indice 0..2 corrispondente alle righe A2..A3 (A1 è header). Se l’ordine dei dati cambia, adegua la logica.
  • Alcune versioni/limiti dell'API Chart di Apps Script non permettono di forzare larghezza/altezza con precisione; in quel caso l’Advanced Sheets Service è l’unica opzione affidabile per preservare esattamente tutte le proprietà.
  • Se vuoi che lo script scelga il chart in base a chartId o titolo dimmelo e adatto lo snippet.
Vuoi che lo adatti per usare un nome foglio diverso o per selezionare un chart specifico?

Almino

unread,
5:03 AM (18 hours ago) 5:03 AM
to google-apps-sc...@googlegroups.com
  The script runs without errors now, but the visual 'offset' is still ignored by the Google Sheets UI. It seems to be a rendering bug rather than a code issue. I've tried both 2D and 3D.image.png
  

вт, 7 квіт. 2026 р. о 06:16 Mario Rossi <projectlaba...@gmail.com> пише:
--
You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/Lp_hFrAQ06w/unsubscribe.
To unsubscribe from this group and all its topics, send an email to google-apps-script-c...@googlegroups.com.

Almino

unread,
5:03 AM (18 hours ago) 5:03 AM
to Google Apps Script Community
зображення_2026-04-07_064303091.png

  The script runs without errors now, but the visual 'offset' is still ignored by the Google Sheets UI. It seems to be a rendering bug rather than a code issue. I've tried both 2D and 3D.  
вівторок, 7 квітня 2026 р. о 06:16:17 UTC+3 Mario Rossi пише:

Mario Rossi

unread,
5:05 AM (18 hours ago) 5:05 AM
to google-apps-sc...@googlegroups.com
Ciao Almino — grazie per l’aggiornamento.

Sembra effettivamente un problema di rendering/UI se lo script non dà errori. Per provare a isolare e risolvere:
  • Verifica se almeno i colori delle slice vengono applicati; se sì conferma che solo l’offset è ignorato.
  • Prova su un altro browser o in incognito e svuota cache; prova anche su un altro account/foglio (per escludere dati/estensioni locali).
  • Crea un foglio nuovo e un grafico minimale (A1:B3) per vedere se il comportamento si ripresenta.
  • Se vuoi una soluzione che aggiri possibili limiti dell’API client, posso fornirti uno snippet che usa lo Sheets Advanced Service (spreadsheets.batchUpdate) per impostare le proprietà slices via JSON: quello di solito applica le impostazioni che l’editor UI a volte ignora.
  • Se preferisci, preparo io la richiesta batchUpdate pronta da incollare (inclusi chartId e slices con offset/color) oppure ti aiuto a segnalare un bug a Google con uno script di riproduzione.
Dimmi quale opzione preferisci (snippet Advanced Service / segnalazione bug / altri test) e preparo il passo successivo.

Mario Rossi

unread,
5:05 AM (18 hours ago) 5:05 AM
to google-apps-sc...@googlegroups.com
Ciao Almino — grazie per l’aggiornamento. Breve risposta con azioni concrete:
  1. Verifiche rapide (cliente/locale)
  • Prova in un altro browser o in finestra di navigazione in incognito e/o con un altro account (per escludere cache/estensioni).
  • Copia il foglio in un nuovo file e ripeti lo script (per escludere corruzione del file).
  1. Forzare il redraw via script
  • Rimuovere e reinserire il chart (come già fai) spesso aiuta; dopo insertChart(), prova a breve Utilities.sleep(500) prima di eventuali modifiche successive.
  • Alternativa: dopo l’inserimento, modifica un’opzione innocua (es. titolo) per forzare il render.
  1. Usare Sheets API (batchUpdate) — più affidabile
  • Le API avanzate di Sheets permettono di impostare proprietà del chart in modo più completo e spesso risolvono problemi di rendering che l’Apps Script ChartBuilder ignora. Posso fornirti uno snippet batchUpdate che imposti slices.offset e slices.color se vuoi.
  1. Segnalare bug
  • Se il problema persiste anche su altri browser/file e con batchUpdate, è molto probabile un bug lato Sheets. Apri un ticket su Issue Tracker di Google (component: Google Sheets) includendo: file di esempio, script minimo che riproduce il problema, screenshot e passi per riprodurlo. Posso aiutarti a preparare il testo del bug.
Se vuoi, preparo subito:
  • uno snippet batchUpdate pronto all’uso per impostare slices (con esempio A1:B3 ed E1:F3), oppure
  • il testo da incollare su Issue Tracker con i dettagli tecnici e lo screenshot.
Dimmi quale preferisci.
Reply all
Reply to author
Forward
0 new messages