Java到Google Spreadsheet

我正在尝试使用Java进行编程,以连接到Google Spreadsheet来执行数据检索或修改单元格中的数据。

我的Google电子表格链接是https://docs.google.com/spreadsheets/d/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA

我查看了Sheets API,它需要链接

https://spreadsheets.google.com/feeds/worksheets/key/private/full

我尝试过不同形式的链接,例如:

  • https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/full

  • https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/full

  • 他们分别给了我不同的错误:

  • com.google.gdata.util.ParseException: Unrecognized content type:application/binary
  • com.google.gdata.util.RedirectRequiredException: Moved Temporarily
  • 我不知道如何使用Java连接到Googl电子表格。 请帮助我,如果你有这方面的经验。

    import com.google.gdata.client.authn.oauth.*;
    import com.google.gdata.client.spreadsheet.*;
    import com.google.gdata.data.*;
    import com.google.gdata.data.batch.*;
    import com.google.gdata.data.spreadsheet.*;
    import com.google.gdata.util.*;
    import org.testng.annotations.Test;
    
    import java.io.IOException;
    import java.net.*;
    import java.util.*;
    
    public class TestGoogleSheetsAPI {
    
        @Test
        public void testConnectToSpreadSheet() throws ServiceException, IOException {
            SpreadsheetService service = new SpreadsheetService("google-spreadsheet");
    
            URL SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/public/full");
            SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
            List<SpreadsheetEntry> spreadsheets = feed.getEntries();
    
            if (spreadsheets.size() == 0) {
                // TODO: There were no spreadsheets, act accordingly.
            }
    
            SpreadsheetEntry spreadsheet = spreadsheets.get(0);
            System.out.println(spreadsheet.getTitle().getPlainText());
        }
    }
    

    我没有使用service.setUserCredentials("xxx@gmail", "password")因为我将发生另一个错误,即com.google.gdata.util.AuthenticationException: Error authenticating (check service name)


    您正在获得重定向,因为访问电子表格需要先进行身份验证。 Google表格使用旧的gdata API,但要求您使用OAuth 2.0进行身份验证。 因此,您需要导入gdata和Google API库,如下所示:

    <dependencies>
        <dependency>
            <groupId>com.google.gdata</groupId>
            <artifactId>core</artifactId>
            <version>1.47.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client-java6</artifactId>
            <version>1.20.0</version>
        </dependency>
    </dependencies>
    

    下面的代码显示了您如何使用OAuth对Google进行身份验证。 您需要按照说明创建服务帐户并首先下载P12密钥。 创建您的服务帐户后,将电子邮件地址复制到下面的CLIENT_ID字段中,将P12文件添加到您的类路径中,并将P12FILE添加到您的P12文件中。

    我可以通过以下SPREADSHEET_FEED_URL“https://spreadsheets.google.com/feeds/worksheets/:worksheetId/private/basic”获得此工作,其中“:worksheetId”是您的工作表ID。 这与你使用的稍有不同。

    请务必确保您的服务帐户有权先阅读或写入电子表格,方法是先与服务帐户电子邮件地址共享。

    public class GoogleSheetsApiTest {
    
    // Generate a service account and P12 key:
    // https://developers.google.com/identity/protocols/OAuth2ServiceAccount
    private final String CLIENT_ID = "<your service account email address>";
    // Add requested scopes.
    private final List<String> SCOPES = Arrays
            .asList("https://spreadsheets.google.com/feeds");
    // The name of the p12 file you created when obtaining the service account
    private final String P12FILE = "/<your p12 file name>.p12";
    
    
    @Test
    public void testConnectToSpreadSheet() throws GeneralSecurityException,
            IOException, ServiceException, URISyntaxException {
    
        SpreadsheetService service = new SpreadsheetService(
                "google-spreadsheet");
        GoogleCredential credential = getCredentials();
        service.setOAuth2Credentials(credential);
    
        URL SPREADSHEET_FEED_URL = new URL(
                "https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/basic");
        SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL,
                SpreadsheetFeed.class);
        List<SpreadsheetEntry> spreadsheets = feed.getEntries();
    
        if (spreadsheets.size() == 0) {
            // // TODO: There were no spreadsheets, act accordingly.
        }
        //
        SpreadsheetEntry spreadsheet = spreadsheets.get(0);
        System.out.println(spreadsheet.getTitle().getPlainText());
    
    }
    
    private GoogleCredential getCredentials() throws GeneralSecurityException,
            IOException, URISyntaxException {
        JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
        HttpTransport httpTransport = GoogleNetHttpTransport
                .newTrustedTransport();
    
        URL fileUrl = this.getClass().getResource(P12FILE);
        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(CLIENT_ID)
                .setServiceAccountPrivateKeyFromP12File(
                        new File(fileUrl.toURI()))
                .setServiceAccountScopes(SCOPES).build();
    
        return credential;
    }
    
    }
    

    我也遇到了com.google.gdata.util.ParseException: Unrecognized content type:application/binary错误,但我似乎偶然发现了这个奇怪的错误的解决方法。 Alex R的答案中的代码可以用作起点。

  • 首先,我尝试将可见性更改为"public" ,以查看会发生什么。 由于文档没有发布,我得到了预期的错误响应,其中包含:

    我们很抱歉。 本文档未刊发。

  • 所以我将能见度改回"private" ,并且为了好玩而再次尝试......

    瞧,瞧! 有效!

  • 它适用于Drive或Spreadsheets Feed范围(如果您愿意,可以包含这两个范围):

  • https://www.googleapis.com/auth/drive
  • https://spreadsheets.google.com/feeds
  • 我不确定它是否是一个因素,但我没有使用OAuth 2.0,而是使用PrivateKey (PKCS12文件)创建的Credential ,就像Brian Chapman的回答一样。

    结论

    所以,尽管它很笨拙,但我已经修改了我的应用程序,以便在发出"private"请求之前始终发出"public"请求(包含在try块中以吸收所产生的Exception )。 这是我能够确定性地获得正确结果的唯一途径。


    您从该网址获得的Feed是一个WorksheetFeed ,而不是一个SpreadsheetFeed 。 尝试这个:

        SpreadsheetService service = new SpreadsheetService("google-spreadsheet");
    
        FeedURLFactory urlFactory = FeedURLFactory.getDefault();
        WorksheetFeed worksheetFeed = service.getFeed(urlFactory.getWorksheetFeedUrl("1V4jT4vSqmY4YNY1VJhariLRLbxfFWf5z8bSTpDcSBPE", "public", "full"), WorksheetFeed.class);
        List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
        WorksheetEntry worksheet = worksheets.get(0);
        System.out.println(worksheet.getTitle().getPlainText());
    
    链接地址: http://www.djcxy.com/p/86771.html

    上一篇: Java to Google Spreadsheet

    下一篇: How to use multiple res.srcDirs and override some resources with gradle