【问题标题】:Not able to access spreadsheet using google spreadsheet API无法使用谷歌电子表格 API 访问电子表格
【发布时间】:2015-06-09 07:37:27
【问题描述】:

我有这段代码试图访问我创建的电子表格。

public class ExpressionExample {

    private static URL cellFeedUrl;

    public static final String SPREADSHEET_URL = "https://spreadsheets.google.com/feeds/spreadsheets/private/full/1QWX-zOkBe36M7oC9sn6z8ZuccGt7Wg-IFwtynn379kM";

    public static void main(String[] args) throws Exception {

        File p12 = new File("key.p12");

        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();

        String[] SCOPESArray = { SPREADSHEET_URL };
        final List SCOPES = Arrays.asList(SCOPESArray);
        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId("XXXX@developer.gserviceaccount.com")
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountPrivateKeyFromP12File(p12).build();

        SpreadsheetService service = new SpreadsheetService("new data service ");

        service.setOAuth2Credentials(credential);

        URL metafeedUrl = new URL(SPREADSHEET_URL);

        SpreadsheetEntry spreadsheet = service.getEntry(metafeedUrl,
                SpreadsheetEntry.class);

        WorksheetEntry sheet = ((WorksheetEntry) spreadsheet.getWorksheets()
                .get(0));

        cellFeedUrl = spreadsheet.getWorksheets().get(0).getCellFeedUrl();

        CellEntry cellA1 = new CellEntry(1, 1, "3");
        CellEntry cellB1 = new CellEntry(1, 2, "high mech");

        String line = "=IF(A1<5,IF(B1={\"high mech\",\"low mech\",\"mid mech\"},10,IF(B1=\"electronic\",20,0)),IF(A1>=5,IF(B1=\"electronic\",40,0),0)) ";
        CellEntry cellc1 = new CellEntry(1, 3, line);

        service.insert(cellFeedUrl, cellA1);
        service.insert(cellFeedUrl, cellB1);
        service.insert(cellFeedUrl, cellc1);

        ExpressionExample e = new ExpressionExample();
        e.printCell(cellA1);
        e.printCell(cellB1);
        e.printCell(cellc1);

        CellQuery query = new CellQuery(cellFeedUrl);
        query.setMinimumRow(1);
        query.setMaximumRow(1);
        query.setMinimumCol(3);
        query.setMaximumCol(3);

        CellFeed feed = service.query(query, CellFeed.class);

        System.out.println(feed.getEntries().indexOf(cellc1));
        for (CellEntry entry : feed.getEntries()) {
            e.printCell(entry);
        }
    }

    public void printCell(CellEntry cell) {
        // String shortId = cell.getId().substring(cell.getId().lastIndexOf('/')
        // + 1);
        System.out.println(" -- Cell(" + "/" + ") formula("
                + cell.getCell().getInputValue() + ") numeric("
                + cell.getCell().getNumericValue() + ") value("
                + cell.getCell().getValue() + ")");
    }
}

执行程序时出现以下错误:

Exception in thread "main" ResourceNotFoundException: Not Found Entry not found

任何帮助将不胜感激。

【问题讨论】:

  • 电子表格 API 的范围是“spreadsheets.google.com/feeds”。除此之外,如果您甚至不说出错误发生在哪里,应该如何帮助您?单步执行程序并找出它停止的位置。 p12文件真的存在吗? p12.exists() 说什么?
  • 我很抱歉,因为我无法添加异常,因为它在堆栈溢出时显示错误。错误出现在这一行 SpreadsheetEntry spreadsheet = service.getEntry(metafeedUrl, SpreadsheetEntry.class);我也将范围更改为“spreadsheets.google.com/feeds”,当我查看服务对象时,我看不到任何条目。你能帮忙吗
  • 您的服务帐户是否有权查看该文件?我推荐使用FeedURLFactory 来构建URL。您在另一条评论中提到的 ID 是您的文档密钥/ID。
  • 为什么excel 标记在这个问题上?如果不相关,请删除标签,或在问题中添加使其相关的信息。

标签: java excel google-sheets google-spreadsheet-api


【解决方案1】:

我认为用于获取条目的电子表格 url 应该是:

"https://spreadsheets.google.com/feeds/spreadsheets/" + file Id

尝试更改,看看是否可以摆脱该错误。

另请查看this 了解更多信息。

【讨论】: