如何使用 google 应用程序脚本更新 Google 工作表(基于 JSON 数据)中特定行的单元格?

How to update cells of a particular row in Google Sheets (based on JSON data) using google apps script?

我正在脚本中获取 JSON 格式的数据(通过 url 参数),看起来像这样 - 例如{"row":3,"data":{"2":"apple","3":"strawberry","5":"pineapple"}}(格式化json)-

{
  "row": 3,
  "data": {
    "2": "nyc",
    "3": "strawberry",
    "5": "18"
    ...
  }
}

现在,要更新单元格,我们需要它的行号和列号 - json 中的 row 是行号,2 3 5 是单元格的列号应该用给定的值更新。

如果我想用它们各自的值更新给定的单元格,我的代码应该是什么样子?这是我想要做的事情的表示 -

(如您所见,对于行号 3,列 235 的单元格值已更新)


我无法弄清楚如何解析此 JSON 并获取目标列及其值的列表,以及如何使用应用程序脚本更新单元格...感谢您的帮助 :) 谢谢!

您可以使用方法 Object.entries() 遍历嵌套对象的键和值

  • 然后使用 Apps 脚本方法 getRange(row, col)setValue() 将值设置到 sheet

样本:

function myFunction() {
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
  var json = {
    "row": 3,
    "data": {
      "2": "nyc",
      "3": "strawberry",
      "5": "18"
    }
  }  
  var row = json.row;
  var data = json.data;
  for (const [col, value] of Object.entries(data)) {
    sheet.getRange(row, col).setValue(value);
  } 
}

  • 请记住,如果您的 JSON 很大并且您设置了很多值,方法 setValue() 将会很慢。在这种情况下,最好先将值存储在数组中,然后通过一次 setValues() 调用将它们设置到 sheet 中。不过这需要相邻的值范围。

参考文献:

启用 google 张 API 服务并尝试使用 batchupdate

const json = { "row": 3, "data": { "2": "apple", "3": "strawberry", "5": "pineapple" } }

function myFunction() {
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();
  var row = json.row;
  var data = [];
  for (const [col, value] of Object.entries(json.data)) {
    data.push({
      range: `${sheet.getName()}!${columnToLetter(+col) + (+row)}`,
      values: [[`${value}`]],
    })
  }
  var resource = {
    valueInputOption: 'USER_ENTERED',
    data: data,
  };
  try { Sheets.Spreadsheets.Values.batchUpdate(resource, ss.getId()); } catch (e) { console.log(JSON.stringify(e)) }
}
function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}
  • 使用Object.entries检索列和值

  • 使用 ${sheet.getName()}!${columnToLetter(+col) + (+row)} 重建工作表和范围以获得地址 sheet1!A1 例如

  • 使用 columnToLetter 函数将数字中的列转换为字母

  • 使用batchUpdate更新