首页 > 解决方案 > google sheet api v4 可能存在的问题

问题描述

我正在尝试使用工作表 API(https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)更新特定范围:

更新请求的主体必须是 ValueRange 对象,但唯一必需的字段是值。如果指定了范围,则它必须与 URL 中的范围相匹配。在ValueRange 中,您可以选择指定其majorDimension。默认情况下,使用 ROWS。如果指定了 COLUMNS,则每个内部数组都写入一列而不是一行。更新时,将跳过没有数据的值。要清除数据,请使用空字符串 ("")。

当我尝试通过发送数据来更新特定单元格时,如下所示:

[
  [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 5523, null, null, null, null, null, null, null, P], 
  [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 5526, null, null, null, null, null, null, null, P]
]

范围是“SheetName!A2:AA3”。

更新的单元格是 A2 B2 和 A3 B3。知道为什么会这样吗?谢谢你。

这是导致此问题的示例:该表最初是:

在此处输入图像描述

代码是:

String spreasheetId = "<SpreadsheetId>";
ValueRange valueRange = new ValueRange();
valueRange.setRange("Sheet15!A2:C4");
valueRange.setMajorDimension("ROWS");
List<Object> ob = Arrays.asList(null,"4",null);
List<Object> ob1 = Arrays.asList(null,"10",null);
List<List<Object>> list = Arrays.asList(ob,new ArrayList<>(),ob1);
valueRange.setValues(list);
sheetService.spreadsheets().values().update(spreasheetId, valueRange.getRange(), valueRange).setValueInputOption("RAW").execute();

我运行代码后的表格是这样的:

在此处输入图像描述

虽然它应该是:

在此处输入图像描述

标签: google-sheets-api

解决方案


从官方文档,在该setValues()区域:

对于输入,支持的值类型有:bool、string 和 double。将跳过空值。要将单元格设置为空值,请将字符串值设置为空字符串。

因此,设置为null的值基本上不会被解释,并且您获得的结果就像您的范围是按如下方式创建的:

List<Object> ob = Arrays.asList("4");
List<Object> ob1 = Arrays.asList("10");
List<List<Object>> list = Arrays.asList(ob,new ArrayList<>(),ob1);
valueRange.setValues(list);

为了实现您在原始问题中定义的目标,您必须:

  1. 获取工作表中的当前数据。
  2. 适当地修改它。
  3. 将其放回工作表。

您的最终代码可能如下所示:

String spreadsheetId = "<SpreadsheetId>";

ValueRange currentRange = service.spreadsheets().values().get(spreadsheetId, "A2:C4").execute();
List<List<Object>> myValues = currentRange.getValues();
myValues.get(0).set(1, "4");
myValues.get(2).set(1, "10");
ValueRange resultRange = new ValueRange().setMajorDimension("ROWS").setValues(myValues);
service.spreadsheets().values().update(spreadsheetId, "A2:C4", resultRange).setValueInputOption("RAW").execute();

推荐阅读