You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Docs自定义菜单批量添加文本超链接需求及代码改造求助

批量给Google Docs指定文本添加标题链接的自定义菜单脚本

功能说明

  • 新增Google Docs自定义菜单「批量文本链接」,支持输入目标文本和对应标题名称
  • 自动检索文档中所有未被链接的目标文本,批量将其链接到指定标题的位置
  • 彻底替代手动逐个添加链接的低效操作

完整代码实现

function onOpen() {
  // 向文档界面添加自定义菜单
  DocumentApp.getUi().createMenu('批量文本链接')
    .addItem('设置文本与对应标题', 'showLinkDialog')
    .addToUi();
}

function showLinkDialog() {
  const ui = DocumentApp.getUi();
  // 弹出输入对话框,收集目标文本和对应标题信息
  const response = ui.prompt(
    '批量链接设置',
    '请输入「目标文本|对应标题名称」(用英文竖线分隔),例如:Target|目标章节标题',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() === ui.Button.OK) {
    const input = response.getResponseText().trim();
    const [targetText, targetTitle] = input.split('|').map(item => item.trim());
    
    if (!targetText || !targetTitle) {
      ui.alert('输入格式错误,请严格按照「目标文本|对应标题名称」的格式填写!');
      return;
    }

    const doc = DocumentApp.getActiveDocument();
    const body = doc.getBody();
    // 查找匹配的标题段落
    const titleElement = findTitleElement(body, targetTitle);
    
    if (!titleElement) {
      ui.alert(`未找到标题「${targetTitle}」,请检查标题名称是否完全匹配!`);
      return;
    }

    // 创建指向标题的书签链接
    const bookmark = doc.addBookmark(titleElement);
    const linkUrl = `#bookmark=${bookmark.getId()}`;

    // 批量替换未链接的目标文本
    const replaceCount = replaceUnlinkedText(body, targetText, linkUrl);
    ui.alert(`批量链接完成!共处理${replaceCount}处未链接的「${targetText}」文本`);
  }
}

function findTitleElement(body, targetTitle) {
  // 遍历所有段落,匹配标题类型且文本一致的元素
  const paragraphs = body.getParagraphs();
  for (const para of paragraphs) {
    const headingType = para.getHeading();
    if (headingType !== DocumentApp.ParagraphHeading.NORMAL && para.getText().trim() === targetTitle) {
      return para;
    }
  }
  return null;
}

function replaceUnlinkedText(body, targetText, linkUrl) {
  let count = 0;
  let searchResult = body.findText(targetText);
  
  while (searchResult) {
    const element = searchResult.getElement();
    const startOffset = searchResult.getStartOffset();
    const endOffsetInclusive = searchResult.getEndOffsetInclusive();
    
    // 跳过已存在链接的文本
    const existingLink = element.getLinkUrl(startOffset);
    if (!existingLink) {
      element.setLinkUrl(startOffset, endOffsetInclusive, linkUrl);
      count++;
    }
    
    // 查找下一个匹配项
    searchResult = body.findText(targetText, searchResult);
  }
  return count;
}

使用步骤

  1. 打开目标Google Docs文档,点击顶部菜单栏「扩展程序」→「Apps脚本」
  2. 清空脚本编辑器中的默认代码,粘贴上述完整代码
  3. 点击「保存」,为脚本命名(例如「批量文本链接工具」)
  4. 关闭脚本编辑器,刷新Docs页面,顶部菜单栏会出现「批量文本链接」选项
  5. 点击「设置文本与对应标题」,按提示输入格式内容,确认后即可完成批量链接

注意事项

  • 标题名称必须与文档中实际标题完全一致(包括大小写、空格、标点)
  • 仅对未添加链接的目标文本生效,已有的链接不会被修改
  • 若目标文本包含特殊字符,输入时需确保完全匹配

内容的提问来源于stack exchange,提问作者Russell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:13:00