Google apps script GoogleSheets脚本:按名称引用图表

Google apps script GoogleSheets脚本:按名称引用图表,google-apps-script,google-sheets,charts,Google Apps Script,Google Sheets,Charts,我正在尝试在图表表中创建一个用户界面,这将允许他们从下拉列表中选择一个图表,然后它将显示在该下拉列表的正下方 最终会有很多图表,可能在另一个图表数据表上,所以我的想法是将图表从数据表移动到图表表,来回移动。不确定这是否可以做到 我的问题是找到一种在脚本中按名称引用图表的方法,而不是按其模糊的ID引用图表 我已经完成了所有的图表类等,并没有看到任何方法来做到这一点。我是否错过了什么,或者是否有其他方法来实现这一点?我相信你的目标如下 从我的问题是找到一种方法来引用脚本中的图表的名称,而不是它的模糊

我正在尝试在图表表中创建一个用户界面,这将允许他们从下拉列表中选择一个图表,然后它将显示在该下拉列表的正下方

最终会有很多图表,可能在另一个图表数据表上,所以我的想法是将图表从数据表移动到图表表,来回移动。不确定这是否可以做到

我的问题是找到一种在脚本中按名称引用图表的方法,而不是按其模糊的ID引用图表


我已经完成了所有的图表类等,并没有看到任何方法来做到这一点。我是否错过了什么,或者是否有其他方法来实现这一点?

我相信你的目标如下

从我的问题是找到一种方法来引用脚本中的图表的名称,而不是它的模糊ID,您希望检索使用特定名称的特定图表。 在本答案的示例脚本中,图表标题用作特定名称

示例脚本: 请设置工作表名称

const ss = SpreadsheetApp.getActiveSpreadsheet();
const chartObj = ss.getSheetByName("Sheet1").getCharts().reduce((o, c) => Object.assign(o, {[c.getOptions().get("title")]: c}), {});
这样,您可以使用图表标题检索图表对象,如下所示

图表标题 当然,您可以指定其他特定名称,而不是图表标题。在下面的示例脚本中,与图表标题对应的特定名称用作键

  const chartNames = {"sampleChartTitle": "sampleName1",,,};
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const chartObj = ss.getSheetByName("chartSample").getCharts().reduce((o, c) => Object.assign(o, {[chartNames[c.getOptions().get("title")]]: c}), {});
在本例中,chartObj[sampleChartTitle]是sampleName1图表标题的图表对象。 增加1: 从您的回复中,我了解到您希望从Google电子表格的所有工作表中检索所有图表。对于这一点,下面的示例脚本如何

示例脚本1: 在这种情况下,可以通过chartObj[图纸名称][图表标题]检索图表。 示例脚本2: 当使用for循环修改示例脚本1时,它变成如下所示。在此示例脚本2中,结果值与示例脚本1相同

const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
const chartObj = {};
for (let i = 0; i < sheets.length; i++) {
  const charts = sheets[i].getCharts();
  const temp = {};
  for (let j = 0; j < charts.length; j++) {
    const chart = charts[j];
    temp[chart.getOptions().get("title")] = chart;
  }
  chartObj[sheets[i].getSheetName()] = temp;
}
在本例中,您可以使用samplesheetName、chartTitle检索图表对象。
谢谢图表是特定于工作表还是电子表格?“我无法从开发文档中看出这一点。@maxhugen感谢您的回复。关于图表是特定于工作表还是电子表格?在上面的示例脚本中,使用了一张工作表。但谷歌电子表格中的所有图表都可以使用。所以我又添加了一个示例脚本。你能确认一下吗?关于我无法从开发文档中理解这一点,我不得不为我糟糕的英语技能道歉。不幸的是,我无法理解这一点。我可以问一下它的细节吗?只是试一下你的代码。。。这比我的水平高了一点,只学了一个月的JS,所以不容易理解。我会建议我怎么去。喜欢你使用标题的想法。@maxhugen谢谢你的回复。对于其他脚本,可以使用chartObj[工作表名称][图表标题]检索特定图表。我之所以使用工作表名称作为键,是因为我担心谷歌电子表格中的所有工作表都可能存在相同的图表标题。如果所有图表的标题都不同,也可以使用不使用工作表名称的脚本。@maxhugen对于给您带来的不便,我深表歉意。虽然我不确定这是否有助于理解脚本,但我又添加了一个示例脚本。你能确认一下吗?
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
const chartObj = {};
for (let i = 0; i < sheets.length; i++) {
  const charts = sheets[i].getCharts();
  const temp = {};
  for (let j = 0; j < charts.length; j++) {
    const chart = charts[j];
    temp[chart.getOptions().get("title")] = chart;
  }
  chartObj[sheets[i].getSheetName()] = temp;
}
function sample(sheetName, chartTitle) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);
  if (!sheet) return null;
  const charts = sheet.getCharts();
  for (let j = 0; j < charts.length; j++) {
    const chart = charts[j];
    if (chart.getOptions().get("title") == chartTitle) {
      return chart;
    }
  }
  return null;
}