我开始用Python探索Google Docs API。除了一件事情,它几乎可以完成我想做的所有事情。
我可以替换文档的文本,但不能更改超链接的值。
如果链接看起来像这样:a link,我可以更改文本function includesIfExists(arr, prop, val) {
return arr ? arr.some(v => v[prop] === val) : true
}
的值,但不能更改目标URL。
我一直在浏览文档,但是找不到任何东西。可能是缺少的功能还是我错过了这样做的方法?
答案 0 :(得分:2)
您可以使用Google Docs API中batchupdate方法的UpdateTextStyleRequest修改超链接。此时,请设置Link
的{{1}}的属性。
TextStyle
POST https://docs.googleapis.com/v1/documents/{file ID}:batchUpdate
如果这对您的情况没有帮助,我深表歉意。
从您的回复评论中,我可以像上面那样理解。如果我的理解正确,则可以使用{
"requests": [
{
"updateTextStyle": {
"textStyle": {
"link": {
"url": "https://sampleUrl" # Please set the modified URL here.
}
},
"range": {
"startIndex": 1,
"endIndex": 2
},
"fields": "link"
}
}
]
}
方法进行检索。在这种情况下,使用documents.get
时,响应变得很容易阅读。
fields
GET https://docs.googleapis.com/v1/documents/{file ID}?fields=body(content(paragraph(elements(endIndex%2CstartIndex%2CtextRun(content%2CtextStyle%2Flink%2Furl)))))
用作body(content(paragraph(elements(endIndex,startIndex,textRun(content,textStyle/link/url)))))
。例如,当以下文本放入Google文档中并且fields
具有超链接时,
def
响应如下。从以下结果中,您可以检索带有超链接的文本的位置。使用此功能,您可以修改超链接。
abc
def
答案 1 :(得分:0)
batchUpdate
需要知道文本的位置,我们可以获取所有内容的文档并找到链接的位置
在我的情况下,我将其实现为:
这里是nodejs中的示例
const {google, docs_v1} = require('googleapis');
async function replaceInDoc(doc) {
let documentId = 'some doc id'
let auth = 'auth value for user'
let linkNewUrl = 'https://github.com/googleapis/google-api-nodejs-client'
google.options({auth: auth})
var docs = new docs_v1.Docs({}, google)
// document should have link with http://repo-url.com text, we will update it
var requests = [
{
replaceAllText: {
containsText: {
text: 'http://repo-url.com',
matchCase: true,
},
replaceText: linkNewUrl,
},
}
]
var updateRes = await docs.documents.batchUpdate({
documentId: documentId,
resource: {
requests: requests,
},
});
var docInfo = await docs.documents.get({documentId: documentId})
var linkPos = findLinksInDoc(docInfo)
// set new url to link by position of link in the document
var requests = [
{
updateTextStyle: {
textStyle: {
link: {
url: linkNewUrl
}
},
range: {
startIndex: linkPos[linkNewUrl][0],
endIndex: linkPos[linkNewUrl][1]
},
fields: "link"
}
}
]
var updateRes = await docs.documents.batchUpdate({
documentId: documentId,
resource: {
requests: requests,
},
});
}
// returns hash as { 'http://example.com': [startPosition, endPosition] }
function findLinksInDoc(doc) {
var links = {}
doc.data.body.content.forEach(section => {
if (section.paragraph) {
section.paragraph.elements.forEach(element => {
if (element.textRun && element.textRun.textStyle.link) {
links[element.textRun.content] = [element.startIndex, element.endIndex]
}
})
}
})
return links
}