通过Google Docs API修改Embedded Object后文档未保存,请问原因是什么?
问题原因及解决方法
你代码里的问题很明确:只从云端拉取了文档的本地副本并修改,但没有把修改后的内容提交回Google Docs服务器。
$this->service->documents->get($this->iddoc)只是获取文档的本地内存对象,修改这个对象的属性不会自动同步到云端。Google Docs API要求所有修改操作必须通过batchUpdate接口提交结构化的更新请求,而不是直接修改get返回的对象。
正确的实现步骤
- 不要直接修改
get返回的InlineObject,而是为每个要修改的嵌入式对象构建UpdateInlineObjectPropertiesRequest - 将所有请求打包到
BatchUpdateDocumentRequest中,调用documents->batchUpdate()提交
修正后的代码示例
// 1. 获取文档里的内嵌对象ID列表 $doc = $this->service->documents->get($this->iddoc); $inlineObjects = $doc->getInlineObjects(); // 2. 构建批量更新请求 $requests = []; foreach ($inlineObjects as $inlineObjectId => $inlineObject) { // 构建要更新的属性 $updateProps = new Google_Service_Docs_UpdateInlineObjectPropertiesRequest(); $updateProps->setInlineObjectId($inlineObjectId); // 设置要修改的字段(description、title、size) $fields = 'embeddedObject.description,embeddedObject.title,embeddedObject.size.height.magnitude'; $updateProps->setFields($fields); // 构建新的内嵌对象属性 $newEmbObj = new Google_Service_Docs_EmbeddedObject(); $newEmbObj->setDescription('koukou__' . $inlineObjectId); $newEmbObj->setTitle('koukou__' . $inlineObjectId); // 设置尺寸 $size = new Google_Service_Docs_Size(); $height = new Google_Service_Docs_Dimension(); $height->setMagnitude(140); $height->setUnit('PT'); // 注意要指定单位,比如PT(磅) $size->setHeight($height); $newEmbObj->setSize($size); // 关联到更新属性 $inlineObjProps = new Google_Service_Docs_InlineObjectProperties(); $inlineObjProps->setEmbeddedObject($newEmbObj); $updateProps->setInlineObjectProperties($inlineObjProps); // 添加到请求列表 $requests[] = new Google_Service_Docs_Request([ 'updateInlineObjectProperties' => $updateProps ]); } // 3. 提交批量更新请求 $batchUpdateRequest = new Google_Service_Docs_BatchUpdateDocumentRequest([ 'requests' => $requests ]); $this->service->documents->batchUpdate($this->iddoc, $batchUpdateRequest);
关键注意点
fields参数必须明确指定要修改的字段,API只会更新你列出的字段- 尺寸修改要指定单位(比如
PT),否则可能不生效 - 每个更新请求都要关联对应的
inlineObjectId,确保修改到正确的对象
内容的提问来源于stack exchange,提问作者Dmitry Trofimov
相关产品推荐
相关产品推荐

