这是我第一次使用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吗?
答案 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";
经过几天的研究而没有得到任何东西,我希望提供这个解决方案能帮助那些试图做同样事情的人。