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

如何通过Google Apps Script获取Google Sheet数据并保留原格式?

解决Google Apps Script获取Sheet内容丢失格式的问题

你当前使用的Sheets.Spreadsheets.Values.get方法只能提取单元格的纯文本内容,会丢失所有富文本结构(比如有序列表的层级、HTML标签、换行等),所以才会出现列表项直接拼接在段落后的情况。以下是两种可行的解决方案:

方案一:基于原生SpreadsheetApp处理富文本转HTML

适合Sheet内是通过富文本编辑器创建的有序列表/段落格式,手动解析文本结构生成HTML:

修改code.gs

function getValues() {
  var spreadSheetId = "SPREADSHEETID"; // 替换为你的表格ID
  var sheet = SpreadsheetApp.openById(spreadSheetId).getSheetByName("Query");
  var range = sheet.getRange("A1:B1");
  var richTextValues = range.getRichTextValues();
  
  // 处理目标单元格(B1)的内容
  var cellText = richTextValues[0][1].getText();
  var lines = cellText.split("\n");
  var html = "";
  var inOrderedList = false;

  lines.forEach(line => {
    line = line.trim();
    if (!line) return;

    // 识别有序列表项(以数字+点开头)
    if (/^\d+\.\s?/.test(line)) {
      if (!inOrderedList) {
        html += "<ol>";
        inOrderedList = true;
      }
      var itemContent = line.replace(/^\d+\.\s?/, "");
      html += `<li>${itemContent}</li>`;
    } else {
      if (inOrderedList) {
        html += "</ol>";
        inOrderedList = false;
      }
      html += `<p>${line}</p>`;
    }
  });

  // 关闭未结束的列表
  if (inOrderedList) html += "</ol>";
  // 添加原有的分割线
  html += "<hr />";

  return [[richTextValues[0][0].getText(), html]];
}

function doGet() {
  return HtmlService
      .createTemplateFromFile('Index')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

修改Index.html

使用<?!= ?>替代<?= ?>,避免HTML标签被转义:

<body>  
  <? var temp = getValues(); ?>  
  <div class="row">
    <div class="col-10">
      <?!= temp[0][1] ?>
    </div>
  </div>
</body>

方案二:使用Sheets API高级服务获取格式信息

适合复杂格式场景,通过API直接获取单元格的格式元数据:

  1. 先在Apps Script编辑器中启用Sheets API:点击左侧「服务」→「添加服务」→ 找到「Sheets API」并启用。

  2. 修改code.gs:

function getValues() {
  var spreadSheetId = "SPREADSHEETID";
  var dataRange = "Query!A1:B1";

  // 获取带格式的单元格数据
  var sheetData = Sheets.Spreadsheets.get(spreadSheetId, {
    ranges: [dataRange],
    fields: "sheets(data(rowData(values(textRun/content,formattedValue))))"
  });

  var targetCell = sheetData.sheets[0].data[0].rowData[0].values[1];
  var textRuns = targetCell.textRun.content.split("\n");
  var html = "";
  var inOrderedList = false;

  textRuns.forEach(run => {
    run = run.trim();
    if (!run) return;

    if (/^\d+\.\s?/.test(run)) {
      if (!inOrderedList) {
        html += "<ol>";
        inOrderedList = true;
      }
      var itemContent = run.replace(/^\d+\.\s?/, "");
      html += `<li>${itemContent}</li>`;
    } else {
      if (inOrderedList) {
        html += "</ol>";
        inOrderedList = false;
      }
      html += `<p>${run}</p>`;
    }
  });

  if (inOrderedList) html += "</ol>";
  html += "<hr />";

  return [[sheetData.sheets[0].data[0].rowData[0].values[0].formattedValue, html]];
}

function doGet() {
  return HtmlService
      .createTemplateFromFile('Index')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
  1. Index.html修改同方案一。

特殊情况:单元格内直接输入HTML代码

如果你的Sheet单元格里是直接写入的完整HTML代码,只需还原转义的标签并保留换行:

function getValues() {
  var spreadSheetId = "SPREADSHEETID";
  var dataRange = "Query!A1:B1";
  var range = Sheets.Spreadsheets.Values.get(spreadSheetId, dataRange, {valueRenderOption: "FORMATTED_VALUE"});
  
  // 还原HTML标签并转换换行
  var htmlContent = range.values[0][1]
    .replace(/&lt;/g, "<")
    .replace(/&gt;/g, ">")
    .replace(/\n/g, "<br>");

  return [[range.values[0][0], htmlContent]];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:01:18