修改 Google 图表 - 在我通过脚本动态更新图表标题(显示日期)后,垂直轴“数字格式”恢复为“来自源数据”

use*_*403 4 google-visualization google-sheets google-apps-script

我正在尝试通过代码更新图表的标题,以便它动态更改。发生这种情况时,标题更改成功,但垂直轴的数字格式更改为日期(更改为来自源数据)。

我不确定它从哪里获取日期,因为源数据设置为“数字”。使用脚本将其更改为“格式化”没有任何效果。它只是忽略它。

即使是宏也不起作用。当我尝试使用宏执行此操作时,出现错误:“异常:在对象 SpreadsheetApp.EmbeddedChartBuilder 上获取方法或属性 setOption 时出现意外错误。”

我有按下按钮时运行的代码。它将图表的标题更改为 K1 中的值,但我不明白为什么它将垂直轴也更改为日期。我只是希望它保持为“无”或“十进制”:

function updateTitle() {
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
  var chart = sheet.getCharts()[0];
  var title = sheet.getRange('K1').getValue();

  chart = chart.modify()

  .setOption('title', title || 'Empty')
  .setOption('vAxis.format', 'none')
  .build();

   sheet.updateChart(chart);
}
Run Code Online (Sandbox Code Playgroud)

我认为代码的格式一定不正确,是真的吗?我在互联网上进行了搜索,发现了很多不同的方法来格式化修改谷歌图表,并尝试了许多不同的变体。我没有得到正确的结果,并且对什么格式是正确的以及为什么我正在做的事情不起作用感到有点迷失。

这是我的图表的示例:https://docs.google.com/spreadsheets/d/16vmDv5sJvle4hLXaz1ZTgkP8V2-5dlWJvdJ9eqPxc-w/edit ?usp=sharing

谢谢

Tan*_*ike 5

问题和解决方法:

我也经历过和你的情况一样的情况。在这种情况下,即使运行以下简单脚本,数字格式也会更改。

var sheet = SpreadsheetApp.getActive().getActiveSheet();
var chart = sheet.getCharts()[0];
sheet.updateChart(chart);
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当时我虽然寻找过保持数字格式的方法updateChart,但没有找到。因此,在这个答案中,我想建议针对您的情况使用 Sheets API。根据我的经验,我已经确认,当使用 Sheets API 时,可以在不更改垂直轴数字格式的情况下更新标题。

当你的脚本被修改后,它会变成如下所示。

示例脚本:

在使用此脚本之前,请在高级 Google 服务中启用 Sheets API

function updateTitle() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var chart = sheet.getCharts()[0];
  var title = sheet.getRange('K1').getValue();
  var chartId = chart.getChartId();

  sheet.getRange("F3:H5").setNumberFormat("0");
  SpreadsheetApp.flush();

  var sheets = Sheets.Spreadsheets.get(ss.getId(), {fields: "sheets(charts)"}).sheets;
  var c = sheets.reduce((ar, s) => {
    var temp = s.charts.filter(c => c.chartId == chartId);
    if (temp.length == 1) ar = ar.concat(temp);
    return ar;
  }, []);
  if (c.length == 1) {
    var chartObj = c[0];
    delete chartObj.position;
    chartObj.spec.title = title || 'Empty';
    Sheets.Spreadsheets.batchUpdate({requests: [{updateChartSpec: chartObj}]}, ss.getId());
  }
}
Run Code Online (Sandbox Code Playgroud)

结果:

当上述脚本用于示例电子表格的示例图表时,将获得以下结果。

在此输入图像描述

笔记:

  • 在这种情况下,单元格“F3:H5”的数字格式反映到纵轴的数字格式。因此,当您想使用类似 的格式时 1.00, 2.00,,,,请从上面的脚本中删除sheet.getRange("F3:H5").setNumberFormat("0")SpreadsheetApp.flush()

  • 在上述脚本的情况下,由于fields不能使用 for UpdateChartSpecRequest],所以首先需要检索图表的所有对象并修改对象,然后将修改后的对象放入图表中。此情况已作为未来请求报告给 Google 问题跟踪器。参考号

参考: