Google drive api 无法使用驱动器API v3更新Google驱动器文件--资源正文包含不可直接写入的字段

Google drive api 无法使用驱动器API v3更新Google驱动器文件--资源正文包含不可直接写入的字段,google-drive-api,Google Drive Api,我正在尝试使用GoogleDriveAPI(v3)对文档进行更新 在谷歌硬盘上 我已经阅读了本迁移指南: 并将其编码为一个新的空文件(),其中包含我要更新的详细信息 然后用它和文件ID调用execute()。 但我还是犯了一个错误。有人能指出我哪里做错了吗? 非常感谢 错误: { "code" : 403, "errors" : [{ "domain" : "global", "message" : "The resource body inc

我正在尝试使用GoogleDriveAPI(v3)对文档进行更新 在谷歌硬盘上

我已经阅读了本迁移指南:

并将其编码为一个新的空文件(),其中包含我要更新的详细信息 然后用它和文件ID调用execute()。 但我还是犯了一个错误。有人能指出我哪里做错了吗? 非常感谢

错误:

{
    "code" : 403,
    "errors" : [{
        "domain" : "global",

        "message" : "The resource body includes fields which are not directly writable.",

        "reason" : "fieldNotWritable"
    }],
    "message" : "The resource body includes fields which are not directly writable."
}
下面的代码片段:

File newFileDetails = new File();        
FileList result = service2.files().list()
    .setPageSize(10)    
    .setFields("nextPageToken, files(id, name)")
    .execute();

List<File> files = result.getFiles();

if (files == null || files.size() == 0) {

    System.out.println("No files found.");

} else {

   System.out.println("Files:");

   for (File file : files) {

      if (file.getName().equals("first_sheet")) {

         System.out.printf("%s (%s)\n", file.getName(), file.getId());


         newFileDetails.setShared(true);


         service2.files().update(file.getId(), newFileDetails).execute();

      }

   }

}
File newFileDetails=newfile();
FileList结果=service2.files().list()
.setPageSize(10)
.setFields(“nextPageToken,文件(id,名称)”)
.execute();
List files=result.getFiles();
如果(files==null | | files.size()==0){
System.out.println(“未找到文件”);
}否则{
System.out.println(“文件:”);
用于(文件:文件){
if(file.getName().equals(“第一张工作表”)){
System.out.printf(“%s(%s)\n”、file.getName()、file.getId());
newFileDetails.setShared(true);
service2.files().update(file.getId(),newFileDetails.execute();
}
}
}

参考,您可以看到
共享
不是一个可写字段。如果你仔细想想,这很有道理。您可以通过添加新权限来共享文件,也可以通过读取共享属性来检查文件是否已共享。但是说一个文件是共享的,而不是通过实际共享它,是没有意义的

在代码中是这样的

Drive service... // your own declared implementation of service
File  file = new File(); //using the com.google.api.services.drive.model package
    // part where you set your data to file like:
file.setName("new name for file");
String fileID = "id of file, which you want to change";
service.files().update(fileID,file).execute();
尝试更改远程文件中的字段,并重写此文件会引发安全异常,如下面的异常。 但这并不能解决你的问题。
如果您想通过电子邮件将文件共享到另一个google帐户,您可以通过使用应用程序的服务帐户重新实现授权到授权,并作为文件所有者添加所需的电子邮件

我也遇到了同样的问题,并找到了解决办法。关键是:必须创建一个没有Id的新文件对象,并在update()方法中使用它。下面是我的一段代码:

val oldMetadata = service!!.files().get(fileId.id).execute()

val newMetadata = File()
newMetadata.name = oldMetadata.name
newMetadata.parents = oldMetadata.parents
newMetadata.description = idHashPair.toDriveString()

val content = ByteArrayContent("application/octet-stream", fileContent)

val result = service!!.files().update(fileId.id, newMetadata, content).execute()

它起作用了。我希望它能对您有所帮助。

谢谢您的回复。实际上,我正在通过电子邮件地址以编程方式与某人共享文档。你的链接很有用。我将尝试添加权限。更明确地说,由于无法更新文件id,因此需要不带文件id的新元数据