使用 Java 和 Google 驱动器 API 创建空电子表格

Creating an empty spreadsheet using Java and the Google Drive API

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

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

 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 也有创建新电子表格的方法。这是应该遵循的正确方法,而不是通过云端硬盘 API?

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

我采用了Android quickstart in the Sheets API, and adapted the code from the .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 class 中声明了它,并将其简单地设置为 private String title = "Sheet Creation Test";

经过几天的研究但一无所获,我希望提供此解决方案能够帮助任何正在尝试做同样事情的人。