You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32+Google Apps Script/Sheets散点图点颜色修改失败求助

问题解决:散点图颜色不生效及触发器疑问

一、先修正代码中的关键错误

你的sample函数存在两处致命错误,导致颜色修改逻辑根本无法执行:

  1. 未定义today变量,直接调用会报错
  2. 获取工作表时逻辑错误,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");
}

二、手动修改图表颜色无效的原因排查

  1. 数据系列异常:散点图要求X/Y轴为数值类型,你的range1是A28:B60(A列是文本姓名),可能导致图表无法正确识别数据系列,颜色设置无法生效。建议将X轴改为行号或时间数值,Y轴对应时间,确保数据类型符合散点图要求。
  2. 图表权限冲突:如果Web App部署时选择“以用户身份执行”,调用者可能没有编辑图表的权限,导致修改不生效。部署时需选择“以我自己的身份执行”,并设置“任何人,甚至匿名者”访问权限。
  3. 空值导致系列不显示:如果单元格为空,对应的图表系列可能被隐藏,颜色设置无法体现。确保数据范围内有有效数据后再尝试修改颜色。

三、触发器是否需要?

不需要额外设置触发器。你在save_data函数末尾已经调用了sample,只要doGet接口被正常触发,save_data执行后就会自动调用sample修改图表颜色。

内容的提问来源于stack exchange,提问作者ScythaScytha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:15:54