有没有办法替换Google Docs API中的文本的URL链接?

时间:2019-04-05 14:59:56

标签: google-docs-api

我开始用Python探索Google Docs API。除了一件事情,它几乎可以完成我想做的所有事情。

我可以替换文档的文本,但不能更改超链接的值。

如果链接看起来像这样:a link,我可以更改文本function includesIfExists(arr, prop, val) { return arr ? arr.some(v => v[prop] === val) : true } 的值,但不能更改目标URL。

我一直在浏览文档,但是找不到任何东西。可能是缺少的功能还是我错过了这样做的方法?

2 个答案:

答案 0 :(得分:2)

您可以使用Google Docs API中batchupdate方法的UpdateTextStyleRequest修改超链接。此时,请设置Link的{​​{1}}的属性。

端点

TextStyle

请求正文:

POST https://docs.googleapis.com/v1/documents/{file ID}:batchUpdate

注意:

  • 根据您的问题,我可以理解您已经使用过Google Docs API,并且可以修改链接文本。我认为您可以使用上面的请求正文和所拥有的脚本来修改链接。

参考文献:

如果这对您的情况没有帮助,我深表歉意。

编辑:

  • 您要检索带有超链接的文本。

从您的回复评论中,我可以像上面那样理解。如果我的理解正确,则可以使用{ "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需要知道文本的位置,我们可以获取所有内容的文档并找到链接的位置

在我的情况下,我将其实现为:

  1. 将模板复制到具有最终名称的新地方
  2. 替换链接文本和文本的其他部分
  3. 获取文档
  4. 在文档中查找链接位置
  5. 更新链接URL

这里是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
}