使用Java和Google Drive API创建空电子表格

时间:2018-01-13 21:15:52

标签: android google-sheets google-drive-api google-spreadsheet-api

这是我第一次使用Drive and Sheets API,我对在创建新文件时应该使用哪一个感到困惑。我希望创建一个空白的google工作表文件,保存在驱动器上,我可以稍后以编程方式编辑。据我了解,Drive API用于基本文件操作;例如创建,删除和移动文件。虽然Sheets API用于更直接的电子表格操作;正在编写数据,格式化等。因此,要创建新的电子表格文件,逻辑会告诉我Drive API将创建我想要的电子表格。由于此处的大多数问题都是使用Drive API的旧版本,因此很难(至少对我而言)将这些流程转换为新的API。

我一直在关注Drive API documentation上提供的指南。因为我正在创建一个空的工作表文件,所以我通过将初始驱动器内容设置为null来更改代码,同时保持与示例一致。 :

 CreateFileActivityOptions createOptions =
              new CreateFileActivityOptions.Builder()
                            .setInitialDriveContents(null)
                            .setInitialMetadata(changeSet)
                            .build();
 return getDriveClient().newCreateFileActivityIntentSender(createOptions);

这是我用来尝试创建文件的完整方法:

    private void saveFileToDrive(){
            Log.i(TAG, "Creating the new file");
            DriveResourceClient mDriveResourceClient;
            mDriveResourceClient =Drive
                    .getDriveResourceClient(this,GoogleSignIn.getLastSignedInAccount(this));
            mDriveResourceClient.createContents()
                    .continueWithTask(new Continuation<DriveContents, Task<Void>>() {

                @Override
                public Task<Void> then(@NonNull Task<DriveContents> task) throws Exception {
                    return createFileIntentSender(task.getResult());
                };
            });
        }

    private Task<Void> createFileIntentSender(DriveContents driveContents){
        Log.i(TAG, "New file being created");

           MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                  .setTitle("New file.xls")
                  .setMimeType("application/vnd.google-apps.spreadsheet")
                  .setStarred(true)
                  .build();

    CreateFileActivityOptions createOptions =
            new CreateFileActivityOptions.Builder()
                    .setInitialDriveContents(null)
                    .setInitialMetadata(changeSet)
                    .build();

    return mDriveClient.newCreateFileActivityIntentSender(createOptions)
            .continueWith(
                    new Continuation<IntentSender, Void>() {
                        @Override
                        public Void then(@NonNull Task<IntentSender> task) throws Exception {
                            return null;
                        }
                    }
            );
}

我已将Mime类型更改为application / vnd.google-apps.spreadsheet,以便创建的新文件是电子表格。我不明白的是,当我从API文档直接实现示例代码时,代码始终会创建一个文件。为什么不创建电子表格?有什么我想念的吗?

Sheets API还有一个创建新电子表格的创建方法。这是正确的方法,而不是通过Drive API吗?

1 个答案:

答案 0 :(得分:1)

经过大量的游戏,我终于能够使用Sheets API创建一个空白的电子表格。我最初阅读Drive and Sheets API(作为这些API的新手)时发现的令人困惑的是,我了解创建新文件的正确工作流程是通过Drive API而不是Sheets API。从我发现的,这是不正确的。

我使用了Android quickstart in the Sheets API中提供的示例代码,并调整了.create method in the reference documentation中的代码。具体来说,我实现了代码以在AsyncTask方法(MakeRequestTask)中创建新的电子表格文件。我所做的如下:

private class MakeRequestTask extends AsyncTask<Void, Void, Spreadsheet> {
    private com.google.api.services.sheets.v4.Sheets mService = null;
    private Exception mLastError = null;



    MakeRequestTask(GoogleAccountCredential credential) {
        HttpTransport transport = AndroidHttp.newCompatibleTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        mService = new Sheets.Builder(
                transport, jsonFactory, credential)
                .setApplicationName("Google Sheets API Android Quickstart")
                .build();
    }

    /**
     * Background task to call Google Sheets API.
     * @param params no parameters needed for this task.
     */
    @Override
    protected Spreadsheet doInBackground(Void... params) {
        try {
            return getDataFromApi();
        } catch (Exception e) {
            mLastError = e;
            cancel(true);
            return null;
        }
    }

    /**
     * Fetch a list of names and majors of students in a sample spreadsheet:
     * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
     * @return List of names and majors
     * @throws IOException
     */
    private Spreadsheet getDataFromApi() throws IOException {

        Spreadsheet requestBody = new Spreadsheet();
        SpreadsheetProperties properties = new SpreadsheetProperties();
        properties.setTitle(title);
        requestBody.setProperties(properties);

        Sheets.Spreadsheets.Create request = mService.spreadsheets().create(requestBody);

        return request.execute();
    }

这里没有显示的是 title 的声明,它被传递到properties.setTitle(title)。我在最初的MainActivity类中声明了这一点,并将其设置为private String title = "Sheet Creation Test";

经过几天的研究而没有得到任何东西,我希望提供这个解决方案能帮助那些试图做同样事情的人。