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

How to get full A1 notation of NamedRange?

Java 程序如何获得 Google 工作表 NamedRange 的完整 A1 表示法,包括其 <sheetName>! 前缀?

要读取 sheet 中的一系列单元格,请调用 Spreadsheets.Values.get(String spreadsheetId, String range),其中 range 采用 A1 表示法。但是,当将范围作为 NamedRange 时,似乎无法获取其 sheet 名称(又名 sheet 标题)以在转换为 A1 表示法时添加前缀。

似乎 API 支持的唯一方法是使用 NamedRange.getRange.getSheetId() 获取 NamedRange 的嵌入式 GridRange 的 sheetID,然后遍历传播 sheet' s sheets 与 Spreadsheet.getSheets() 直到一个 sheet 的 getProperties().getSheetId() 匹配 GridRange 的 sheetID。但是 NamedRange.getRange.getSheetId() 几乎总是 returns null 而不是来自 sheet 的 URL 的 gid=<sheetID>。事实上,我不明白为什么调用只是间歇性地 returns 正确的 sheetID 而不是返回 null.

我再次 运行 包含 NamedRange.getRange.getSheetId() 的程序无法可靠地 return sheetID 值(而不是 returning null)。它已经 returning null 一整天,在昨天 returning 正确的 sheetID 一次之后 null。现在它可靠地 returning sheetID。

这里的问题看起来像 Google Sheets API Spreadsheets 网络服务间歇性失败,没有任何其他迹象,也没有来自 Google 的任何坦白。 Java API,特别是用于管理 NamedRange,似乎很少使用,如果你 google 人们报告甚至成功使用它,没有提到它失败。

这当然是最糟糕的一种错误。我现在甚至无法重现它以将其报告给 Google,无论如何这通常是徒劳的。我将不得不继续测试它直到它可靠地失败,然后将它报告给 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

sheet当定义相应的命名范围时没有 sheet 部分(即只是 A1:B2 而不是 Sheet1!A1:B2).

A1 notation Google API 文档的章节指出:

A1:B2 refers to the first two cells in the top two rows of the first visible sheet.