Java程序如何获得Google表格NamedRange
的完整A1表示法,包括其<sheetName>!
前缀?
要阅读工作表中的一系列单元格,请拨打Spreadsheets.Values.get(String spreadsheetId, String range)
,其中range
为A1表示法。但是当获得范围为NamedRange
时,似乎无法获得其工作表名称(AKA表标题)以转换为A1表示法的前缀。
似乎API支持的唯一方法是使用NamedRange.getRange.getSheetId()
获取NamedRange的嵌入式GridRange的sheetID,然后使用Spreadsheet.getSheets()
遍历电子表格的工作表,直到一个工作表的getProperties()。getSheetId()匹配GridRange的sheetID。但NamedRange.getRange.getSheetId()
几乎总是从工作表的网址返回null
而不是gid=<sheetID>
。实际上我不明白为什么调用只是间歇性地返回正确的sheetID而不是返回null
。
答案 0 :(得分:0)
有一个关于如何在Java Quickstart中执行此操作的代码示例。这是片段:
String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
String range = "Class Data!A2:E";
ValueRange response = service.spreadsheets().values()
.get(spreadsheetId, range)
.execute();
答案 1 :(得分:0)
我再次运行了包含NamedRange.getRange.getSheetId()
的程序,该程序无法可靠地返回sheetID值(而是返回null
)。昨天在其他null
之间返回正确的sheetID之后,它一整天都在返回null
。现在它可靠地返回了sheetID。
此处的问题看起来像Google表格API Spreadsheets
网络服务间歇性地失败,没有任何其他迹象,没有任何来自谷歌的承认。 Java API,尤其是用于管理NamedRange
的Java API似乎很少使用,如果你谷歌的人报告甚至成功使用它,没有提到它失败。
这当然是最糟糕的错误。我现在甚至无法重现它向Google报告,无论如何这往往是徒劳的。我必须继续测试它,直到它可靠地失败然后报告给谷歌,然后等待永远发现他们永远不会修复它。
附加代码失败。我评论了失败的getSheetId()
行,但后来开始正常工作。
private static String getRangeNameA1Str(String spreadsheetId, String rangeNameStr)
throws IOException
{
// Get spreadsheet by its ID.
Spreadsheet spreadsheet = sheetsService.spreadsheets().get(spreadsheetId).execute();
// Get named range.
NamedRange namedRange =
spreadsheet.getNamedRanges().parallelStream()
.filter(aRange -> aRange.getName().equals(rangeNameStr))
.findFirst()
.get();
// Get named range's GridRange for its A1 notation components.
GridRange gridRange = namedRange.getRange();
// Get named range's sheet's name.
Integer sheetID = gridRange.getSheetId(); // *** This call was getting null but then started getting the correct sheet ID.
String sheetName =
spreadsheet.getSheets().parallelStream()
.filter(aSheet -> aSheet.getProperties().getSheetId().equals(sheetID))
.findFirst()
.get()
.getProperties()
.getTitle();
// Get named range's A1 notation from its GridRange's components.
String rangeA1Str =
sheetName + "!" +
Character.toString((char)((int)gridRange.getStartColumnIndex()+65)) +
(gridRange.getStartRowIndex()+1) +
":" +
Character.toString((char)((int)gridRange.getEndColumnIndex()+65)) +
gridRange.getEndRowIndex();
return(rangeA1Str);
} // getNamedRangeA1String
public static Sheets getSheetsService()
throws IOException
{
Credential credential = authorize();
return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
} // getSheetsService
答案 2 :(得分:0)
sheetId字段设置为NULL。
Google API文档的A1 notation一章指出:
A1:B2引用第一个单元格的前两行中的前两个单元格 可见的表。