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
。
当我看到你的请求正文时,在 updateTextStyle
,range
是 {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方法中,insertText
和updateTextStyle
不能批量请求。在这种情况下,需要为每个请求将它们分开。因此,为了实现您的新问题,需要使用以下请求正文。
示例请求正文:
{
"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.
从你的第一个和第二个问题来看,我不明白你想要那个。例如,如果要按顺序排列值 sample3
、sample2
和 sample1
。并且您想将粗体设置为 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
的时候,要求使用默认的文字样式。因为不用这个的时候,sample1
被sample2
的文字样式设置为粗体。请注意这一点。
关于你接下来的第三个问题,
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
时,当在一个请求中同时使用insertText
和updateTextStyle
时,会出现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 方的当前规范。
所以我已经习惯了 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
。
当我看到你的请求正文时,在 updateTextStyle
,range
是 {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方法中,insertText
和updateTextStyle
不能批量请求。在这种情况下,需要为每个请求将它们分开。因此,为了实现您的新问题,需要使用以下请求正文。
示例请求正文:
{
"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.
从你的第一个和第二个问题来看,我不明白你想要那个。例如,如果要按顺序排列值 sample3
、sample2
和 sample1
。并且您想将粗体设置为 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
的时候,要求使用默认的文字样式。因为不用这个的时候,sample1
被sample2
的文字样式设置为粗体。请注意这一点。
关于你接下来的第三个问题,
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
时,当在一个请求中同时使用insertText
和updateTextStyle
时,会出现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 方的当前规范。