使用 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";
经过几天的研究但一无所获,我希望提供此解决方案能够帮助任何正在尝试做同样事情的人。
这是我第一次使用 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";
经过几天的研究但一无所获,我希望提供此解决方案能够帮助任何正在尝试做同样事情的人。