【问题标题】:plot data to their respective rows将数据绘制到各自的行
【发布时间】:2019-09-10 04:54:36
【问题描述】:

有一组数据需要显示在电子表格中。我的意思是数据将具有以下值 每行(在本例中为第 1 行、第 2 行等)。我需要在电子表格中显示它们。我怎么能显示 这些数据到它们各自的行名。我只能找到要绘制数据的范围。

这是我的做法

function plotData() {
 var data = [
  {
    "Row1": "Row1 Data",
    "Row7": 5,
    "WillNotBeInOther": 0.75
  },
  {
    "Row2": 5000,
    "Row3": 0,
    "Row4": 5000,
    "Row5": null,
    "Row6": 5,
    "Row7": null,
    "Row8": 0.25,
    "Row9": 0,
    "Row10": 0
  },
  {
    "Row2": 6000,
    "Row3": 20000,
    "Row4": 26000,
    "Row5": null,
    "Row6": null,
    "Row7": null,
    "Row8": null,
    "Row9": 0,
    "Row10": 0
  },
  {
    "Row2": 7000,
    "Row3": 1000,
    "Row4": 8000,
    "Row5": null,
    "Row6": null,
    "Row7": null,
    "Row8": null,
    "Row9": 0,
    "Row10": 0
  }
]

  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "PlotData";
  var sheet = activeSheet.getSheetByName(sheetname);
  var startRow = 4;
  var lastRow = sheet.getLastRow();
  var plottableSheetRange = sheet.getRange(startRow, 3, lastRow-startRow+1, data.length);
  plottableSheetRange.setValue(10)
}

这是我正在处理的电子表格

https://docs.google.com/spreadsheets/d/1tLNZv4F4lpBAnmHN5H0pBiirW4MVIfTexll9jPA03hI/edit#gid=0

code.gs 是脚本。

应该是这样的

https://docs.google.com/spreadsheets/d/1tLNZv4F4lpBAnmHN5H0pBiirW4MVIfTexll9jPA03hI/edit#gid=1869973739

【问题讨论】:

  • 您共享电子表格的脚本似乎与您的问题不同。我们应该使用哪个脚本?你也能提供你期望的输出吗?
  • @Tanaike 抱歉,我已经用数据更新了脚本。我也列出了样本表。
  • 感谢您回复和更新共享电子表格。当我看到您期望的输出表时,我认为data 的数组的索引可能对应于列号。但是在data的第一个索引处,似乎没有使用{"Row1": "Row1 Data", "Row7": 5, "WillNotBeInOther": 0.75},"Row7": 5"WillNotBeInOther": 0.75。那么您能解释一下将data 转换为放入电子表格的值的逻辑吗?
  • 在我的情况下,第一个对象将始终与剩余对象不同。因此,就像在样本表(输出表)中一样,您在 C 列中只有第 1 行被填充,而对于 d 到 f 列,第 2 行到第 10 行被填充。由于第一个对象 {"Row1": "Row1 Data", "Row7": 5, "WillNotBeInOther": 0.75} 没有任何其他列在工作表中,因此除了第 1 行之外,其他列都没有填写。
  • 感谢您的回复。我为我的理解不佳道歉。关于{"Row1": "Row1 Data", "Row7": 5, "WillNotBeInOther": 0.75}的值,使用"Row1": "Row1 Data"。但是"Row7": 5"WillNotBeInOther": 0.75 没有被使用。我无法理解这种情况的逻辑。

标签: google-apps-script google-sheets


【解决方案1】:
  • 您想使用 Google Apps Script 实现从以下对象到图像。

    • 发件人:

      var data = [
        {"Row1":"Row1Data","Row7":5,"WillNotBeInOther":0.75},
        {"Row2":5000,"Row3":0,"Row4":5000,"Row5":null,"Row6":5,"Row7":null,"Row8":0.25,"Row9":0,"Row10":0},
        {"Row2":6000,"Row3":20000,"Row4":26000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0},
        {"Row2":7000,"Row3":1000,"Row4":8000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0}
      ];
      
    • 收件人:

  • 您想输入单元格“B4”中的值。

  • 作为您对上述值的规范,您只想在第一个索引处使用来自{"Row1":"Row1Data","Row7":5,"WillNotBeInOther":0.75}Row1 的值。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个答案之一。

在您使用以下脚本之前,please enable Sheets API at Advanced Google services。当数组的所有列长度不一样时,Spreadsheets.Values.update的方法很容易把数组放到Spreadsheet中。所以我使用了 Sheets API。

模式一:

在这种模式中,从Row1Row 10 的键名也被放入。

示例脚本:

function plotData() {
  var data = [
    {"Row1":"Row1Data","Row7":5,"WillNotBeInOther":0.75},
    {"Row2":5000,"Row3":0,"Row4":5000,"Row5":null,"Row6":5,"Row7":null,"Row8":0.25,"Row9":0,"Row10":0},
    {"Row2":6000,"Row3":20000,"Row4":26000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0},
    {"Row2":7000,"Row3":1000,"Row4":8000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0}
  ];

  // Convert "data" to an array for putting to Spreadsheet.
  var values = data.reduce(function(ar, e, i) {
    if (i === 0) e = {"Row1": e["Row1"]}; // From your replying, the first index is modified for your specification.
    Object.keys(e).forEach(function(f) {
      var n = Number(f.replace("Row", "")) - 1;
      if (!Array.isArray(ar[n])) ar[n] = ["Row " + (n + 1)];
      ar[n][i + 1] = e[f];
    });
    return ar;
  }, []);

  // Put the converted array to Spreadsheet.
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "PlotData";
  var sheet = activeSheet.getSheetByName(sheetname);
  var startRow = 4;
  var range = "'" + sheetname + "'!B" + startRow;
  Sheets.Spreadsheets.Values.update({values: values}, activeSheet.getId(), range, {valueInputOption: "USER_ENTERED"});
}

模式 2:

在这种模式中,从Row1Row 10 的键名没有被放置。

示例脚本:

function plotData() {
  var data = [
    {"Row1":"Row1Data","Row7":5,"WillNotBeInOther":0.75},
    {"Row2":5000,"Row3":0,"Row4":5000,"Row5":null,"Row6":5,"Row7":null,"Row8":0.25,"Row9":0,"Row10":0},
    {"Row2":6000,"Row3":20000,"Row4":26000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0},
    {"Row2":7000,"Row3":1000,"Row4":8000,"Row5":null,"Row6":null,"Row7":null,"Row8":null,"Row9":0,"Row10":0}
  ];

  // Convert "data" to an array for putting to Spreadsheet.
  var values = data.reduce(function(ar, e, i) {
    if (i === 0) e = {"Row1": e["Row1"]}; // From your replying, the first index is modified for your specification.
    Object.keys(e).forEach(function(f) {
      var n = Number(f.replace("Row", "")) - 1;
      if (!Array.isArray(ar[n])) ar[n] = [];
      ar[n][i] = e[f];
    });
    return ar;
  }, []);

  // Put the converted array to Spreadsheet.
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "PlotData";
  var sheet = activeSheet.getSheetByName(sheetname);
  var startRow = 4;
  var range = "'" + sheetname + "'!C" + startRow;
  Sheets.Spreadsheets.Values.update({values: values}, activeSheet.getId(), range, {valueInputOption: "USER_ENTERED"});
}

参考:

【讨论】:

  • 我不明白Object.keys(e).forEach(function(f) { 部分。如果名称类似于Share ValueShare Percentage 而不是Row 1Row 2 等怎么办?只是想了解一下。
  • @Serenity 感谢您的回复。 1. 关于Object.keys(e).forEach(function(f) {,检索作为数组元素的对象的每个键。并创建二维数组以放入电子表格。你可以在Object.keys()查看更多信息。
  • @Serenity 2. 关于What if the name is like Share Value, Share Percentage instead of Row 1, Row 2 etc?,我想支持你。但是,不幸的是,我看不到你的问题的愿景。我认为这是一个新问题。那么您可以通过包含详细信息将其作为新问题发布吗?因为当您的初始问题被评论更改时,看到您的问题的其他用户会感到困惑。通过将其发布为新问题,包括我在内的用户可以想到您的新问题。届时,请关闭此问题。如果您能合作解决您的新问题,我很高兴。
  • 首先非常感谢您的善意努力和帮助大自然。很抱歉提出一个新问题。我提出了一个新问题,因为我不明白您如何将值映射到相应的行名。这是stackoverflow.com/questions/57870723/…。仅更改行的名称。请你解释一下好吗?
  • @Serenity 感谢您的回复和回复。我想检查一下。
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 2019-09-22
  • 2023-03-25
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多