求脚本:从Google Slides提取带HTML标签的笔记至Google Sheets并拆分内容
批量提取Google Slides演讲笔记并按模块导入Google Sheets(保留HTML格式)
核心解决方案:Google Apps Script直接处理
直接通过Slides API读取带格式的演讲笔记,识别固定加粗标题后拆分模块,再写入Sheets并保留HTML格式,是最高效的规模化处理方式。以下是完整脚本,可直接在Google Apps Script编辑器中运行:
function extractSlidesNotesToSheets() { // 替换为你的演示文稿ID和目标表格ID const PRESENTATION_ID = "你的Google Slides ID"; const SHEET_ID = "你的Google Sheets ID"; const presentation = SlidesApp.openById(PRESENTATION_ID); const slides = presentation.getSlides(); const sheet = SpreadsheetApp.openById(SHEET_ID).getActiveSheet(); // 清空表格现有内容(可选,根据需求调整) sheet.clearContents(); // 写入表头 sheet.appendRow(["幻灯片编号", "Comments", "Notes to Instructor", "Notes to Student"]); // 遍历每张幻灯片 slides.forEach((slide, index) => { const slideNum = index + 1; const notesPage = slide.getNotesPage(); const notesText = notesPage.getSpeakerNotesShape().getText(); const paragraphs = notesText.getParagraphs(); // 初始化三个模块的HTML内容 let commentsHtml = ""; let instructorNotesHtml = ""; let studentNotesHtml = ""; let currentModule = null; // 解析每个段落,识别标题并归类内容 paragraphs.forEach(paragraph => { const textRange = paragraph.getText(); const runs = textRange.getRuns(); let paragraphHtml = ""; let isBoldTitle = false; let titleText = ""; // 检查段落是否为加粗的固定标题 runs.forEach(run => { const text = run.getText(); const style = run.getTextStyle(); if (style.isBold()) { titleText += text; isBoldTitle = true; } // 生成当前文本片段的HTML let runHtml = text; if (style.isBold()) runHtml = `<b>${runHtml}</b>`; if (style.isItalic()) runHtml = `<i>${runHtml}</i>`; if (style.isUnderline()) runHtml = `<u>${runHtml}</u>`; paragraphHtml += runHtml; }); // 匹配固定标题,切换当前模块 if (isBoldTitle) { switch(titleText.trim()) { case "Comments": currentModule = "comments"; break; case "Notes to Instructor": currentModule = "instructor"; break; case "Notes to Student": currentModule = "student"; break; default: currentModule = null; } // 标题本身也加入对应模块的HTML if (currentModule) { paragraphHtml += "<br>"; } } // 将段落HTML加入当前模块 if (currentModule && paragraphHtml.trim() !== "") { switch(currentModule) { case "comments": commentsHtml += paragraphHtml + "<br>"; break; case "instructor": instructorNotesHtml += paragraphHtml + "<br>"; break; case "student": studentNotesHtml += paragraphHtml + "<br>"; break; } } }); // 处理多余的换行 commentsHtml = commentsHtml.replace(/<br>$/, ""); instructorNotesHtml = instructorNotesHtml.replace(/<br>$/, ""); studentNotesHtml = studentNotesHtml.replace(/<br>$/, ""); // 将当前幻灯片的数据写入表格 const row = [slideNum, commentsHtml, instructorNotesHtml, studentNotesHtml]; const newRow = sheet.appendRow(row); // 为每个模块的单元格设置HTML格式 sheet.getRange(newRow.getRow(), 2).setHtmlContent(commentsHtml); sheet.getRange(newRow.getRow(), 3).setHtmlContent(instructorNotesHtml); sheet.getRange(newRow.getRow(), 4).setHtmlContent(studentNotesHtml); }); SpreadsheetApp.getUi().alert("笔记提取完成!"); }
关键逻辑说明
- 格式识别与HTML转换:遍历笔记中的每个文本片段,根据Slides的文本样式(加粗、斜体、下划线)生成对应的HTML标签,确保格式完整保留。
- 标题匹配与模块切换:通过检查段落中的加粗文本是否匹配固定标题(
Comments/Notes to Instructor/Notes to Student),自动切换内容归类的目标模块。 - 高效写入Sheets:先写入纯文本行,再通过
setHtmlContent方法为单元格设置HTML格式,既保证写入效率,又保留样式。
替代思路:PDF导出中转处理
如果Slides笔记包含复杂格式(如列表、颜色)导致直接API处理受限,可通过以下步骤中转:
- 导出带笔记的PDF:在Google Slides中选择「文件」→「下载」→「PDF文档」,勾选「包含演讲者笔记」选项,导出PDF文件。
- PDF文本提取:使用Google Apps Script的
DriveApp读取PDF,结合内置的PDF解析能力提取带格式的笔记文本。 - 模块拆分与写入:通过正则表达式匹配加粗标题(PDF中加粗文本通常会有特殊标记),拆分三个模块后写入Sheets并转换为HTML格式。
注意:该方法需额外处理PDF格式的解析,复杂度高于直接API处理,仅推荐用于极端复杂格式的场景。
内容的提问来源于stack exchange,提问作者d-ron
相关产品推荐
相关产品推荐

