使用Google API向GDoc添加文本时出现随机段落样式问题
Google Docs API批量更新问题:文本自动应用Heading 6样式且段落样式设置报错
我编写了一个用于构建Google Docs batchUpdate请求的add_text方法,用来向文档插入带格式的文本,但插入的文本自动被应用了Heading 6样式,找不到该样式的来源(上一段是Heading 5,不存在上下文继承的情况)。
原add_text方法代码:
def add_text( self, text, bold=None, color=None, font_size=None, bg_color=None, italic=None, ): if text == "": return else: # Force to string to further processing text = str(text) style_updates = { "updateTextStyle": { "range": { "startIndex": self.index, "endIndex": self.index + len(text), }, "textStyle": { "bold": False, "italic": False, "foregroundColor": { "color": { "rgbColor": { "red": 0, "green": 0, "blue": 0, } } }, "backgroundColor": {}, }, "fields": "bold, italic, foregroundColor, backgroundColor", } } if bold: style_updates["updateTextStyle"]["textStyle"]["bold"] = bold if italic: style_updates["updateTextStyle"]["textStyle"]["italic"] = italic if color: style_updates["updateTextStyle"]["textStyle"][ "foregroundColor" ] = { "color": { "rgbColor": { "red": color[0], "green": color[1], "blue": color[2], } } } if font_size: style_updates["updateTextStyle"]["textStyle"]["fontSize"] = { "magnitude": font_size, "unit": "PT", } style_updates["updateTextStyle"]["fields"] += ", fontSize" if bg_color: style_updates["updateTextStyle"]["textStyle"][ "backgroundColor" ] = { "color": { "rgbColor": { "red": bg_color[0], "green": bg_color[1], "blue": bg_color[2], } } } self.updates += [ { "insertText": { "location": { "index": self.index, }, "text": text, } }, style_updates, ] self.index += len(text)
我尝试添加段落样式设置来解决这个问题,但触发了Google API的"操作不被允许"异常,尝试的代码片段:
if style: style_updates["updateParagraphStyle"] = { "range": { "startIndex": self.index, "endIndex": self.index + len(text), }, "paragraphStyle": {"namedStyleType": style}, "fields": "namedStyleType", }
问题分析与解决方案
1. 自动应用Heading 6的原因
当插入文本时,如果没有显式指定段落样式,Google Docs API会使用文档的默认段落样式(恰好是Heading 6),或者因操作上下文残留导致样式继承异常。
2. 段落样式设置报错的原因
你将updateParagraphStyle合并到了style_updates字典中,而Google Docs API要求batchUpdate的每个操作是独立的字典对象,不能将多个操作类型合并到同一个字典里。
修正后的完整代码
def add_text( self, text, bold=None, color=None, font_size=None, bg_color=None, italic=None, style=None, # 添加段落样式参数 ): if text == "": return else: # Force to string to further processing text = str(text) # 1. 插入文本的独立操作 insert_op = { "insertText": { "location": { "index": self.index, }, "text": text, } } self.updates.append(insert_op) # 2. 文本样式更新的独立操作 style_updates = { "updateTextStyle": { "range": { "startIndex": self.index, "endIndex": self.index + len(text), }, "textStyle": { "bold": False, "italic": False, "foregroundColor": { "color": { "rgbColor": { "red": 0, "green": 0, "blue": 0, } } }, "backgroundColor": {}, }, "fields": "bold, italic, foregroundColor, backgroundColor", } } if bold: style_updates["updateTextStyle"]["textStyle"]["bold"] = bold if italic: style_updates["updateTextStyle"]["textStyle"]["italic"] = italic if color: style_updates["updateTextStyle"]["textStyle"][ "foregroundColor" ] = { "color": { "rgbColor": { "red": color[0], "green": color[1], "blue": color[2], } } } if font_size: style_updates["updateTextStyle"]["textStyle"]["fontSize"] = { "magnitude": font_size, "unit": "PT", } style_updates["updateTextStyle"]["fields"] += ", fontSize" if bg_color: style_updates["updateTextStyle"]["textStyle"][ "backgroundColor" ] = { "color": { "rgbColor": { "red": bg_color[0], "green": bg_color[1], "blue": bg_color[2], } } } self.updates.append(style_updates) # 3. 段落样式更新的独立操作(单独添加到updates列表) if style: paragraph_op = { "updateParagraphStyle": { "range": { "startIndex": self.index, "endIndex": self.index + len(text), }, "paragraphStyle": {"namedStyleType": style}, "fields": "namedStyleType", } } self.updates.append(paragraph_op) self.index += len(text)
使用示例
调用add_text时,显式传入style="NORMAL_TEXT"即可覆盖默认的Heading 6样式:
# 插入普通样式的加粗文本 obj.add_text("测试内容", bold=True, style="NORMAL_TEXT")
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

