在Google文档中,将小型大写字母格式应用于部分行

问题描述 投票:0回答:1

我正在尝试编写一个脚本,以便用他们的小型大写版本替换特定的单词。我在我的文档中创建了一个小型大写样式Heading6,但它只能作为一个整体应用于文本范围。可以部分应用这种风格吗?

这是我的尝试:

function applyHeading(textToFind){
   var style = {};
   style[DocumentApp.Attribute.HEADING] = DocumentApp.ParagraphHeading.HEADING6;
   var body = DocumentApp.getActiveDocument().getBody();
   var foundElement = body.findText(textToFind);

    while (foundElement != null) {
      // Get the text object from the element
      var foundText = foundElement.getElement().asText();

      // Where in the element is the found text?
      var start = foundElement.getStartOffset();
      var end = foundElement.getEndOffsetInclusive();

      var newText = foundText.getText().substring(0, start) + textToFind.toLowerCase() + foundText.getText().substring(end + 1);
      foundText.setText(newText);
      // Set style -- does not work
      foundText.setAttributes(start, end, style);

      // Find the next match
      foundElement = body.findText(textToFind, foundElement);
    }
}
google-apps-script google-docs
1个回答
0
投票
  • 您想将找到的文本转换为小写大写字母。

我可以像上面那样理解。如果我的理解是正确的,那么这个示例脚本怎么样?

不幸的是,在目前阶段,还没有方法将文本部分修改为文件服务中的小写大写字母。我认为这可以通过未来更新的文档服务来实现。但作为当前的解决方法,我认为最近发布的Google Docs API可能可用于实现此目的。所以我挑战了这个。

要在运行脚本之前使用以下示例脚本,请在API控制台中启用Google Docs API,如下所示。

在API控制台启用Google Docs API:

  • 在脚本编辑器上 资源 - >云平台项目 查看API控制台 在“入门”中,单击“浏览并启用API”。 在左侧,单击“库”。 在“搜索API和服务”中,输入“文档”。然后点击“Google文档API”。 单击启用按钮。 如果已启用API,请不要关闭。

流:

示例脚本的流程如下。

  1. 使用文档服务的findText方法在Google文档上查找文本。
  2. 使用Google Docs API的get方法从Google文档中检索所有内容。 每个内容对应于Document的每个段落。
  3. 使用检索到的内容和findText方法检索的对象创建所有找到的文本的范围。
  4. 使用Google Docs API的batchUpdate方法修改找到的文本的文本样式。

示例脚本:

示例脚本用于包含Google Document的容器绑定脚本。请将以下脚本复制并粘贴到脚本编辑器,然后运行sample()函数。

function applySmallCapital(textToFind) {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var id = doc.getId();
  var baseUrl = "https://docs.googleapis.com/v1/documents/";
  var headers = {"Authorization": "Bearer " + ScriptApp.getOAuthToken()};
  var params = {headers: headers};

  // Retrieve all contents from Google Document.
  var res = UrlFetchApp.fetch(baseUrl + id + "?fields=*", params);
  var obj = JSON.parse(res.getContentText());

  // In order to use at Google Docs API, create ranges of found texts.
  var foundElement = body.findText(textToFind);
  var ranges = [];
  while (foundElement != null) {
    var p = foundElement.getElement();
    if (p.getType() == DocumentApp.ElementType.TEXT) p = p.getParent();
    if (p.getType() == DocumentApp.ElementType.PARAGRAPH || p.getType() == DocumentApp.ElementType.LIST_ITEM) {
      var content = obj.body.content[body.getChildIndex(p) + 1];
      ranges.push({
        startIndex: content.startIndex + foundElement.getStartOffset(),
        endIndex: content.startIndex + foundElement.getEndOffsetInclusive(),
      });
    }
    foundElement = body.findText(textToFind, foundElement);
  }

  // Modify textStyle of found texts.
  if (ranges.length > 0) {
    var resource = {requests: ranges.map(function(e) {return {
      updateTextStyle: {
        textStyle: {smallCaps: true},
        range: e,
        fields: "smallCaps"}
      }
    })};
    params.method = "post";
    params.contentType = "application/json";
    params.payload = JSON.stringify(resource);
    UrlFetchApp.fetch(baseUrl + id + ":batchUpdate", params);
  }
}

function sample() {
  applySmallCapital("this should be small caps");
}

结果:

From:

enter image description here

To:

enter image description here

  • 为了测试此脚本,使用了共享文档中的示例文本。您可以看到“this should be small caps”的文本被修改为小写大写字母。

参考文献:

添加:

使用高级Google服务的Google Docs API时,上述脚本如下所示。使用此功能时,请在高级Google服务中启用Google文档API。在这个脚本中,通过减少一个循环,成本略低于上面的成本。

function applySmallCapital(textToFind) {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var id = doc.getId();

  // Retrieve all contents from Google Document.
  var obj = Docs.Documents.get(id, {fields: "*"})

  // In order to use at Google Docs API, create ranges of found texts.
  var foundElement = body.findText(textToFind);
  var requests = [];
  while (foundElement != null) {
    var p = foundElement.getElement();
    if (p.getType() == DocumentApp.ElementType.TEXT) p = p.getParent();
    if (p.getType() == DocumentApp.ElementType.PARAGRAPH || p.getType() == DocumentApp.ElementType.LIST_ITEM) {
      var content = obj.body.content[body.getChildIndex(p) + 1];
      requests.push({
      updateTextStyle: {
        textStyle: {smallCaps: true},
        range: {
          startIndex: content.startIndex + foundElement.getStartOffset(),
          endIndex: content.startIndex + foundElement.getEndOffsetInclusive(),
        },
        fields: "smallCaps"}
      });
    }
    foundElement = body.findText(textToFind, foundElement);
  }

  // Modify textStyle of found texts.
  if (requests.length > 0) {
    var resource = {requests: requests};
    Docs.Documents.batchUpdate(resource, id);
  }
}

function sample() {
  applySmallCapital("this should be small caps");
}

Reference:

© www.soinside.com 2019 - 2024. All rights reserved.