我正在尝试使用Smartsheet API编写一个简单的Java程序,该API通过一个相当大的工作表,并缩进某些行。这是一些类似于我正在使用的代码。
Smartsheet smartsheet = new SmartsheetBuilder().setAccessToken("[My Access Token]").build();
sheetId = 00000000000000; // My Sheet ID
Sheet sheet = smartsheet.sheetResources().getSheet(sheetId, null, null, null, null, null, null, null);
List<Row> rows = sheet.getRows();
Row row = new Row();
row.setId(rows.get(2).getId()); // Updating the second row of the sheet.
row.setIndent(1);
row.setParentId(rows.get(1).getId()); // Set the parent as the row immediately above (which is not indented).
Cell cell = new Cell();
cell.setColumnId(rows.get(1).getCells().get(0).getColumnId());
cell.setValue("Test");
List<Cell> cells = Arrays.asList(cell);
row.setCells(cells);
rows = Arrays.asList(row);
smartsheet.sheetResources().rowResources().updateRows(sheetId, rows);
当我运行它时,我总是在最后一行得到以下错误。
Exception in thread "main" com.smartsheet.api.InvalidRequestException: Invalid row location.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.smartsheet.api.internal.AbstractResources$ErrorCode.getException(AbstractResources.java:147)
at com.smartsheet.api.internal.AbstractResources.handleError(AbstractResources.java:894)
at com.smartsheet.api.internal.AbstractResources.putAndReceiveList(AbstractResources.java:745)
at com.smartsheet.api.internal.SheetRowResourcesImpl.updateRows(SheetRowResourcesImpl.java:252)
at Test3.main(Test3.java:67)
缩进似乎导致这种情况,就像我删除了setIndent(...)行一样,它运行正常。我在这里做错了吗?预先感谢您的帮助。
从代码中删除此行,它应该工作:
row.setParentId(rows.get(1).getId());
由于您要更新现有行的缩进,因此无需指定parentId
(父行的ID未更改)。
我已经确认以下Update Row请求有效(成功缩进指定的行并更新单元格值 - 正如您尝试的那样):
PUT https://api.smartsheet.com/2.0/sheets/8074385778075524/rows
[
{
"id": "6033604149045124",
"cells": [
{"columnId": "5004885470013316","value": "TEST_VALUE"}
],
"indent": 1
}
]
并且以下Update Row请求失败并显示您报告的相同错误(无效的行位置),因为它包含parentId
属性。
[
{
"id": "6033604149045124",
"cells": [
{"columnId": "5004885470013316","value": "TEST_VALUE"}
],
"indent": 1,
"parentId": "2655904428517252"
}
]
我认为它试图访问一个不存在的行。
我没有尝试您的特定代码,但是,我的理解是您应该能够在不设置parentId的情况下设置setIndent。在添加新行时使用parentId,在更新现有行时使用setIndent。
为了补充Kim所说的,你可以通过设置parentId
来设置indent
来进行缩进。你不能两者都做,否则你会得到你看到的Invalid row location
错误。
例如,您可以创建row
对象的实例并设置其id
。
// Row to indent
Row rowToIndent = new Row();
rowToIndent.setId(rows.get(2).getId());
走parentId
路线,您还需要设置位置。例如,你可以使用setToBottom(true)
,它会将行的底行子行设置为父行。像这样:
// Set ParentId
rowToIndent.setParentId(rows.get(1).getId()); // Set the parent as the row immediately above (which is not indented).
rowToIndent.setToBottom(true);
或者,你可以用这条线去sentIndent(1)
路线:
// Set Indent
rowToIndent.setIndent(1);
此外,此时,如果您尝试缩进已缩进的行或缩进不可能的标识级别,您还将收到Invalid row location
异常。