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

求助:修改代码以适配Google Slides与Google Sheets

适配Google Docs/Sheets/Slides的自定义字体设置脚本

你原来的代码仅适配Google Docs,要同时支持三个服务,核心是判断当前运行环境,再调用对应服务的API处理选区和字体设置。下面是完整适配代码:

function onOpen(e) {
  // 根据当前环境获取UI对象
  let ui;
  if (DocumentApp.getActiveDocument()) {
    ui = DocumentApp.getUi();
  } else if (SpreadsheetApp.getActiveSpreadsheet()) {
    ui = SpreadsheetApp.getUi();
  } else if (SlidesApp.getActivePresentation()) {
    ui = SlidesApp.getUi();
  } else {
    return; // 不在支持的环境中直接退出
  }

  // 创建统一的自定义菜单
  ui.createMenu('XYV Font')
    .addItem('Load XYV Font', 'cm_Font')
    .addToUi();
}

function cm_Font() {
  const targetFont = "Noto Serif";

  // 处理Google Docs
  try {
    const doc = DocumentApp.getActiveDocument();
    const selection = doc.getSelection();
    if (selection) {
      const rangeElements = selection.getRangeElements();
      rangeElements.forEach(element => {
        if (element.getElement().editAsText) {
          const textElement = element.getElement().editAsText();
          textElement.setFontFamily(
            element.getStartOffset(),
            element.getEndOffsetInclusive(),
            targetFont
          );
        }
      });
      return;
    }
  } catch (e) {}

  // 处理Google Sheets
  try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    const range = sheet.getActiveRange();
    if (range) {
      range.setFontFamily(targetFont);
      return;
    }
  } catch (e) {}

  // 处理Google Slides
  try {
    const slide = SlidesApp.getActivePresentation();
    const selection = slide.getSelection();
    const pageElements = selection.getPageElementRange().getPageElements();
    
    pageElements.forEach(element => {
      // 处理文本框、形状中的文本
      if (element.asShape) {
        const shape = element.asShape();
        if (shape.getText()) {
          shape.getText().setFontFamily(targetFont);
        }
      }
      // 处理表格单元格文本
      if (element.asTable) {
        const table = element.asTable();
        for (let row = 0; row < table.getNumRows(); row++) {
          for (let col = 0; col < table.getNumColumns(); col++) {
            table.getCell(row, col).getText().setFontFamily(targetFont);
          }
        }
      }
    });
    return;
  } catch (e) {}

  // 无匹配环境或无选区时提示用户
  const ui = SpreadsheetApp.getUi() || DocumentApp.getUi() || SlidesApp.getUi();
  ui.alert('请先选中内容,或确认当前在支持的Google文档环境中');
}

核心差异说明

  • Google Docs:保留原有逻辑核心,通过editAsText()获取文本元素,指定选区范围设置字体
  • Google Sheets:选中对象是单元格范围,直接调用Range.setFontFamily()即可批量设置
  • Google Slides:需区分选中元素类型(形状、表格等),分别获取文本对象后设置字体,代码中覆盖了常见文本容器,可按需扩展其他元素类型

注意事项

  • 确保目标字体(如示例中的Noto Serif)是对应服务可识别的字体(即使未在默认列表中)
  • 脚本需绑定到对应的Docs/Sheets/Slides文件中运行,每个文件需单独绑定并授权

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:40