【问题标题】:Creating an empty spreadsheet using Java and the Google Drive API使用 Java 和 Google Drive API 创建一个空的电子表格
【发布时间】:2018-06-22 23:40:02
【问题描述】:

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

我一直遵循Drive API documentation 上提供的指南。因为我正在创建一个空工作表文件,所以我通过将 initial drive contents 设置为 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 也有一个 create 方法来创建一个新的电子表格。这是要遵循的正确方法,而不是通过 Drive API?

【问题讨论】:

  • 您是否尝试过手动创建电子表格文件,然后看到与该文件关联的元数据正在使用获取请求?
  • 我实际上正在考虑下一步。目前,我正在使用Drive 的 REST API 并以这种方式创建文件。它涉及更多,我还没有得到有意义的结果。
  • 谢谢。如果收到请报告。
  • 我目前正在使用this documentation。具体来说,我正在使用 AsyncTask 创建新文件。在 doInBackground 中,我正在调用一个方法来创建文件,该方法类似于主要方法 here。我得到一个 IOExeption 并且不知道如何解决它....
  • 我能体会到我离做对有多近了。在我的 doInBackground 方法中,我现在只是无法获取与 GoogleAccountCredential 关联的令牌。我会继续研究这个

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


【解决方案1】:

经过大量尝试,我终于能够使用 Sheets API 创建一个空白电子表格。最初阅读 Drive 和 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";

经过几天的研究但没有得到任何结果,我希望提供此解决方案将帮助任何尝试做同样事情的人。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多