如何用Apps Script自动从HTML文件提取数据至Google Sheets?
解决方案:自动处理Drive文件夹中的HTML文件并同步到Google Sheets
完整代码实现
直接复制以下代码到Google Sheets的脚本编辑器(工具→脚本编辑器),替换对应参数即可使用:
function syncHtmlToSheets() { // 替换成你的目标Drive文件夹ID和Sheet名称 const FOLDER_ID = "你的Drive文件夹ID"; const SHEET_NAME = "数据跟踪表"; // 获取目标文件夹和目标Sheet const folder = DriveApp.getFolderById(FOLDER_ID); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME); // 遍历文件夹内所有HTML文件 const files = folder.getFilesByType(MimeType.HTML); while (files.hasNext()) { const file = files.next(); // 跳过已经处理过的文件(通过"已处理"标签判断) if (file.getLabels().includes("已处理")) continue; // 读取HTML文件内容 const htmlContent = file.getBlob().getDataAsString(); // 解析HTML中的表格(默认取页面第一个表格,可按需调整) try { const doc = XmlService.parse(htmlContent); const root = doc.getRootElement(); const tables = root.getDescendants(XmlService.getNamespace(null), "table"); if (tables.length === 0) { file.addLabel("已处理"); // 标记无表格的文件,避免重复扫描 continue; } // 提取表格的行和单元格数据 const tableData = []; const rows = tables[0].getChildren("tr"); rows.forEach(row => { const rowData = []; // 同时提取表头(<th>)和单元格(<td>)内容 const cells = row.getChildren("td").concat(row.getChildren("th")); cells.forEach(cell => { rowData.push(cell.getText().trim()); // 去除多余空格 }); tableData.push(rowData); }); // 将数据追加到Sheet的末尾 if (tableData.length > 0) { const lastRow = sheet.getLastRow(); sheet.getRange(lastRow + 1, 1, tableData.length, tableData[0].length).setValues(tableData); } } catch (e) { // 如果HTML解析出错,标记为"处理失败",方便排查 file.addLabel("处理失败"); console.log(`处理文件${file.getName()}出错: ${e.message}`); continue; } // 标记文件为已处理,避免重复同步 file.addLabel("已处理"); } }
配置步骤
- 获取Drive文件夹ID:打开目标Drive文件夹,地址栏中
folders/后面的字符串就是ID,复制替换代码里的FOLDER_ID。 - 设置Sheet名称:把代码里的
SHEET_NAME改成你的数据跟踪表的实际名称。 - 首次授权测试:在脚本编辑器中点击运行按钮,第一次会弹出授权请求,按照提示完成权限验证(需要允许脚本访问Drive和Sheets)。
- 设置自动触发:点击编辑器左侧的时钟图标(触发器),添加新触发器:
- 选择函数:
syncHtmlToSheets - 事件源:选「时间驱动」(比如每天固定时间运行一次),或者选「从Drive触发」(当文件夹有新文件添加时自动运行,需在高级设置里配置)。
- 选择函数:
关键调整说明
- 多表格筛选:如果你的HTML里有多个表格,不想取第一个,可以通过表格的class或ID筛选。比如把
tables[0]改成:const targetTable = tables.find(table => table.getAttribute("class") === "jira-table"); - 编码兼容:如果HTML出现乱码,把
getDataAsString()改成getDataAsString("UTF-8")或对应编码。 - 重新处理文件:如果需要重新处理某个文件,只需在Drive中移除该文件的「已处理」标签即可。
内容的提问来源于stack exchange,提问作者David Oliphant
相关产品推荐
相关产品推荐

