如何获得NamedRange的完整A1表示法?

时间:2018-03-11 08:34:47

标签: java google-sheets-api

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

3 个答案:

答案 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)

当定义了没有工作表部件(即仅A1:B2而不是Sheet1!A1:B2)的相应命名范围时,GridRange对象的

sheetId字段设置为NULL。

Google API文档的

A1 notation一章指出:

  

A1:B2引用第一个单元格的前两行中的前两个单元格   可见的表。