ESP32+Google Apps Script/Sheets散点图点颜色修改失败求助
问题解决:散点图颜色不生效及触发器疑问
一、先修正代码中的关键错误
你的sample函数存在两处致命错误,导致颜色修改逻辑根本无法执行:
- 未定义
today变量,直接调用会报错 - 获取工作表时逻辑错误,
getSheetByName需要传入日期字符串,而非Sheet对象
修正后的sample函数:
function sample() { const ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1jekdkBVGJju-gmjtsZpUYbST9m0ujzl6tJoQthDB6Rs/edit#gid=0"); const today = new Date(); const formattedDate = Utilities.formatDate(today, ss.getSpreadsheetTimeZone(), "MM-dd-yyyy"); const sheet = ss.getSheetByName(formattedDate); if (!sheet) { Logger.log("目标工作表不存在"); return; } const charts = sheet.getCharts(); if (charts.length === 0) return; // 计算图表的总数据系列数 const chart = charts[0]; const numSeries = chart.getRanges().reduce((total, range) => total + range.getNumColumns(), 0); // 设置颜色:第一个系列红色,其余绿色 const colors = ["red", ...Array(numSeries - 1).fill("green")]; const updatedChart = chart.modify() .asScatterChart() .setColors(colors) .build(); sheet.updateChart(updatedChart); }
另外,将save_data中设置学生姓名的代码移到addNewSheetForToday里,避免每次调用save_data都重复写入:
function addNewSheetForToday() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var date = new Date(); var formattedDate = Utilities.formatDate(date, spreadsheet.getSpreadsheetTimeZone(), "MM-dd-yyyy"); var existingSheet = spreadsheet.getSheetByName(formattedDate); if (existingSheet) { Logger.log("今日工作表已存在"); return; } var newSheet = spreadsheet.insertSheet(formattedDate); newSheet.getCharts().forEach(c => newSheet.removeChart(c)); createScatterPlot(newSheet); // 设置学生姓名(移自save_data) var studentnames = ["", "Alep", "Bet", "Gamal", "Dalat", "Heh", "Waw", "Zen", "Khet", "Tet", "Yod", "Kap", "Lamad", "Meem", "Noon", "Simkat", "Eh", "Peh", "Sahdeh", "Qope", "Resh", "Sheen", "Tao", "Martin", "Allyson", "Ashur", "Matilda", "Odin", "Ophelia", "Brownie", "Oreo", "SubCard1", "SubCard2", "SubCard3"]; for (var i = 0; i < studentnames.length; i++) { newSheet.getRange("A" + (i + 27)).setValue(studentnames[i]); } var numRows = studentnames.length + 27 - 1; // 匹配学生姓名数量 var numColumns = 15; var colors = ['#BBBBBB', '#CCCCCC']; for (var c = 28; c <= numRows; c++) { var colorIndex = (c - 2) % colors.length; var row = newSheet.getRange(c, 1, 1, numColumns); row.setBackground(colors[colorIndex]); } var headerRow = newSheet.getRange(27, 2, 1, numColumns); headerRow.setFontStyle("italic"); var headerColumn = newSheet.getRange(28, 1, numRows, 1); headerColumn.setFontWeight("bold"); }
二、手动修改图表颜色无效的原因排查
- 数据系列异常:散点图要求X/Y轴为数值类型,你的
range1是A28:B60(A列是文本姓名),可能导致图表无法正确识别数据系列,颜色设置无法生效。建议将X轴改为行号或时间数值,Y轴对应时间,确保数据类型符合散点图要求。 - 图表权限冲突:如果Web App部署时选择“以用户身份执行”,调用者可能没有编辑图表的权限,导致修改不生效。部署时需选择“以我自己的身份执行”,并设置“任何人,甚至匿名者”访问权限。
- 空值导致系列不显示:如果单元格为空,对应的图表系列可能被隐藏,颜色设置无法体现。确保数据范围内有有效数据后再尝试修改颜色。
三、触发器是否需要?
不需要额外设置触发器。你在save_data函数末尾已经调用了sample,只要doGet接口被正常触发,save_data执行后就会自动调用sample修改图表颜色。
内容的提问来源于stack exchange,提问作者ScythaScytha
相关产品推荐
相关产品推荐

