google 文档 api - 创建具有多种文本样式(如粗体、斜体等)的单个段落时遇到问题

google docs api - trouble creating single paragraph with multiple text styles like bold, italic, etc

所以我已经习惯了 google 文档 API,但我仍然遇到一个问题。当我尝试将粗体和斜体等样式混合到一个段落中时,样式显示不正确。

相反,当我设置为粗体和斜体时,文本范围恢复为 Areal 字体类型(这与我设置的不同)然后继续段落的其余部分:

奇怪的是,如果我在请求前后添加一个简单的换行符,它就可以正常工作。我可以有一段常规文本,然后是粗体,然后是常规文本,然后是斜体:

但是当我不添加换行符时,它不能正常工作。我认为这可能是一个索引问题(尽管我正在采用建议的方法根据请求向后构建文档,因此索引确实不应该是问题,我不会直接处理它。)

也可能是我在每个文本样式更新请求中都包含了段落样式,这可能与某些内容有冲突?

或者我正在尝试做的事情实际上还不受支持?毕竟是 api 的 v.1。

我用来发出请求的 fn:

function textRequest(text: string, fontSize: number, alignment = 'CENTER', lineSpacing = 100, color = 0.3, style = ' '){
  const requests:Array<object> = [
    {
      insertText: {
        text: text,
        location: {
          index: 1,
        },
      },
    },
    {
      updateParagraphStyle: {           
        paragraphStyle: {
          lineSpacing: lineSpacing,
          namedStyleType: 'NORMAL_TEXT',
          alignment: alignment,
          direction: 'LEFT_TO_RIGHT'
        },
        fields: 'namedStyleType, alignment, direction, lineSpacing',
        range: {
          startIndex: 1,
          endIndex: text.length + 1,
        },
      }
    },
    {
      updateTextStyle: {
        textStyle: {
          bold: style === 'BOLD',
          italic: style === 'ITALIC',
          foregroundColor: {
            color: {
              rgbColor: {
                red: color,
                green: color,
                blue: color
              }
            }
          },
          fontSize: {
            magnitude: fontSize,
            unit: 'PT'
          },
          weightedFontFamily: {
            fontFamily: 'PT',
            weight: 400
          }
        },
        fields: 'bold, italic, foregroundColor, fontSize, weightedFontFamily',
        range: {
          startIndex: 1,
          endIndex: text.length + 1,
        },
      },
 
    }
  ];
  return requests;
}

然后我通过推送这样的调用来构建完整的请求:

request.push(textRequest(text.trim(), 12, 'START', 200, 0.3, 'BOLD')

无论如何,欢迎所有想法或建议。谢谢!

问题 1

我相信你的目标如下。

  • 比如sample1 sample2 sample3的一段放在GoogleDocument using DocsAPI时,你想设置粗体为sample2

当我看到你的请求正文时,在 updateTextStylerange{startIndex: 1, endIndex: text.length + 1,}。在这种情况下,这种文字风格体现在整个text中。我认为这可能是您遇到问题的原因。如果要对段落中的部分文字设置粗体,需要将部分文字设置为range.

在这里,我想介绍一个简单的示例请求体如下。当sample1 sample2 sample3的一段加粗为sample2的段落被放入Google Document using Docs API时,示例请求正文如下。

示例请求正文:

{
  "requests": [
    {
      "insertText": {
        "text": "sample1 sample2 sample3",
        "location": {
          "index": 1
        }
      }
    },
    {
      "updateTextStyle": {
        "textStyle": {
          "bold": true
        },
        "range": {
          "startIndex": 9,
          "endIndex": 16
        },
        "fields": "bold"
      }
    }
  ]
}
  • 将此请求体用于DocsAPI的batchUpdate方法时,得到如下结果。此外,您可以简单地在 Try this method.

    测试此请求正文

参考:

问题 2

根据您的以下新问题,

is there a way to accomplish the same thing, but with 3 SEPARATE insertText requests? So.. sample 1 is first request with style normal, sample 2 is second request with style bold, and sample 3 is normal again.

不幸的是,我认为这些过程不能通过 3 个请求来实现。因为,在Google Docs API的batchUpdate方法中,insertTextupdateTextStyle不能批量请求。在这种情况下,需要为每个请求将它们分开。因此,为了实现您的新问题,需要使用以下请求正文。

示例请求正文:

{
  "requests": [
    {
      "insertText": {
        "text": "sample1 ",
        "location": {
          "index": 1
        }
      }
    },
    {
      "insertText": {
        "text": "sample2 ",
        "location": {
          "index": 9
        }
      }
    },
    {
      "updateTextStyle": {
        "textStyle": {
          "bold": true
        },
        "range": {
          "startIndex": 9,
          "endIndex": 16
        },
        "fields": "bold"
      }
    },
    {
      "insertText": {
        "text": "sample3",
        "location": {
          "index": 17
        }
      }
    }
  ]
}
  • 当此请求体为运行时,得到与上图相同的结果

问题 3

根据您的以下回复,

In my example I am trying to build the document in reverse so the index will always = 1. And the endIndex should always = text.length + 1. I do this because I do not know every start/endIndex for bold or italic. The request needs to be build dynamically.

从你的第一个和第二个问题来看,我不明白你想要那个。例如,如果要按顺序排列值 sample3sample2sample1。并且您想将粗体设置为 sample2.

在这种情况下,下面的示例请求正文怎么样?

{
  "requests": [
    {
      "insertText": {
        "text": "sample3",
        "location": {
          "index": 1
        }
      }
    },
    {
      "insertText": {
        "text": "sample2 ",
        "location": {
          "index": 1
        }
      }
    },
    {
      "updateTextStyle": {
        "textStyle": {
          "bold": true
        },
        "range": {
          "startIndex": 1,
          "endIndex": 8
        },
        "fields": "bold"
      }
    },
    {
      "insertText": {
        "text": "sample1 ",
        "location": {
          "index": 1
        }
      }
    },
    {
      "updateTextStyle": {
        "range": {
          "startIndex": 1,
          "endIndex": 8
        },
        "fields": "*"
      }
    }
  ]
}

在这个request body中,当放sample1的时候,要求使用默认的文字样式。因为不用这个的时候,sample1sample2的文字样式设置为粗体。请注意这一点。

关于你接下来的第三个问题,

I still do not understand why I cannot make updateStyle request after updateText request. This way I always know the start and endIndex will be correct.

在你的第二个问题的示例请求正文中,我没有使用 updateText。当您将updateText 错误复制为insertText 时,当在一个请求中同时使用insertTextupdateTextStyle 时,会出现Invalid value at 'requests[0]' (oneof), oneof field 'request' is already set. Cannot set 'updateTextStyle' 的错误。所以,我认为这是 Google 方的当前规范。因此,why I cannot make updateStyle request after insertText request 的第 3 个问题的答案是由于 Google 方的当前规范。