UpdateTextStyle 请求在设置 fontFamily 时清除粗体

UpdateTextStyle Request Clearing Bold When Setting fontFamily

我正在尝试使用 API 更新 Google Docs 文档中一系列文本的字体。我试图只更改字体而不是字体大小或样式属性,如粗体或斜体。因此,例如,如果我有一个文档,其中仅包含以下文本作为内容:

你好世界

我只想更改 Hello 一词的字体,但要保持它的大小不变,并且仍然是粗体和斜体。

我尝试使用以下代码完成此操作 documents.batchUpdate 请求

{
  "requests": [
    {
      "updateTextStyle": {
        "range": {
          "startIndex": 1,
          "endIndex": 6
        },
        "textStyle": {
          "weightedFontFamily": {
            "fontFamily": "Times New Roman"
          }
        },
        "fields": "weightedFontFamily"
      }
    }
  ]
}

结果是来自服务器的成功响应,但是当我检查文档时,我看到它更改了字体,保留了大小和斜体属性,但没有保留粗体属性。我也使用 Google API Explorer 尝试过,并且可以重现相同的结果。

我的问题是如何在不丢失粗体的情况下更改字体?看起来它应该是可能的,因为它保持了斜体属性。为什么粗体不同?是错误吗?

我的目标是只更改字体而保留其他属性,所以我不想明确设置粗体或其他属性。我也不想事先确定属性并重新设置它们。这是更多的工作,而且会更慢,如果保持斜体则不需要。

我可以使用 repeatCell.cell.userEnteredFormat.textFormat.fontFamily 请求在 Google 工作表中毫无问题地做一些非常相似的事情,并且它保持粗体和斜体。

在此先感谢您的任何见解或帮助。

如何在不丢失粗体的情况下更改字体?

回答

您必须先保存要修改的文本范围的字体粗细和粗体设置。该范围可能有不止一种字体设置。要获取范围的字体粗细和粗体设置,您必须首先检查 textRun.textStyle。如果那里没有定义,您必须查找名为 StyleType 的段落并检查它的粗细和粗体设置。如果那里没有定义,您必须检查 NORMAL_TEXT namedStyleType。如果未在此处定义,则必须使用 Google 文档编辑器默认值,权重为 400,粗体为 false。

获得范围内的字体信息后,请求每种不同的字体。该请求与原始问题中的请求类似,但会根据保存的字体信息设置 weightedFontFamily.weight 和粗体属性。

{
  "requests": [
    {
      "updateTextStyle": {
        "range": {
          "startIndex": 1,
          "endIndex": 6
        },
        "textStyle": {
          "weightedFontFamily": {
            "fontFamily": "Times New Roman"
            "weight": savedWeight
          },
          "bold": savedBold
        },
        "fields": "weightedFontFamily"
      }
    }
  ]
}

为什么粗体不同?

回答

Google 文档 API 使用 weightedFontFamily,其中权重 sub-attribute 默认为 400 而不是当前字体粗细。粗体的设置只是增加了权重,所以粗体和粗体是联系在一起的。目前 API 中没有设置字体的方法,只留下 weight/bold。

这是一个错误吗?

回答

根据@Tanaike 的回复,我已通过 Google 问题跟踪器 (https://issuetracker.google.com/165029692) 将此问题报告给 Google。他们告诉我它正在按预期工作。