如何通过Google Apps Script按行读取整个谷歌表格为文本文件并解析随机单元格中的JSON内容
嘿,我来帮你搞定这两个Google Apps Script的需求——不管是按行优先顺序读取非空单元格里的JSON内容,还是把整个表格按行导出成文本文件,都有清晰的实现方案,一起来看:
1. 按行优先顺序读取非空单元格的JSON内容
要实现A1→B1→C1→A2→B2→C2...的读取顺序,同时跳过空单元格,我们可以直接遍历表格的二维数据数组,先逐行再逐列检查,遇到非空的字符串单元格就尝试解析JSON,完全不会插入多余的分号,和UrlFetchApp.fetch+JSON.parse的体验一致。
代码示例:
function readJsonCellsInRowOrder() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getDataRange(); // 只获取有内容的单元格范围,提升效率 const values = dataRange.getValues(); // 得到rows×columns的二维数组 const parsedJsonList = []; // 按行优先遍历:先处理第一行的所有列,再第二行,以此类推 for (let rowIndex = 0; rowIndex < values.length; rowIndex++) { const currentRow = values[rowIndex]; for (let colIndex = 0; colIndex < currentRow.length; colIndex++) { const cellContent = currentRow[colIndex]; // 跳过空单元格,且只处理字符串类型(JSON是文本格式) if (cellContent !== "" && typeof cellContent === "string") { try { const jsonData = JSON.parse(cellContent); parsedJsonList.push(jsonData); // 如果你需要记录单元格位置,改成这样: // parsedJsonList.push({ // cellAddress: `${String.fromCharCode(65 + colIndex)}${rowIndex + 1}`, // data: jsonData // }); } catch (error) { console.log(`单元格${String.fromCharCode(65 + colIndex)}${rowIndex + 1}的内容不是有效JSON:${error.message}`); } } } } // 这里可以对解析后的JSON数据做后续处理,比如打印、写入其他表格等 console.log("读取到的有效JSON数据:", parsedJsonList); return parsedJsonList; }
关键说明:
getDataRange()会自动定位表格中有内容的最大范围,避免遍历整个表格的空白区域,效率更高;- 双层循环严格遵循行优先的读取顺序,完全匹配你要的A1→B1→C1...的逻辑;
- 加入了JSON解析的错误捕获,避免无效JSON导致脚本崩溃,同时会在控制台提示问题单元格的位置;
- 如果需要追踪每个JSON对应的单元格位置,可以取消注释里的代码,把位置信息和JSON数据一起存储。
2. 按行读取整个表格并导出为文本文件
如果要把表格按行读取,生成纯文本文件(可以跳过空单元格,也可以保留),我们可以把每行的内容处理成字符串,再合并成完整文本,最后保存到Google Drive。
代码示例:
function exportSheetToTextFile() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getDataRange(); const values = dataRange.getValues(); // 处理每行内容:过滤空单元格,无空格拼接;如果要保留空单元格,去掉.filter()即可 const textRows = values.map(row => { return row.filter(cell => cell !== "").join(""); // 要是需要分隔符(比如逗号、制表符),改成join(",")或join("\t")就行 }); // 把所有行用换行符连接,生成完整文本 const fullTextContent = textRows.join("\n"); // 保存到Google Drive(默认根目录,可改成指定文件夹) const targetFolder = DriveApp.getRootFolder(); // 换成指定文件夹:DriveApp.getFolderById("你的文件夹ID") const textFile = targetFolder.createFile("表格导出文本.txt", fullTextContent, MimeType.PLAIN_TEXT); console.log(`文本文件已创建:${textFile.getName()},访问链接:${textFile.getUrl()}`); return textFile; }
关键说明:
map()遍历每一行,filter()跳过空单元格,join("")实现无空格拼接,你可以根据需求修改join的参数来添加分隔符;- 如果需要保留空单元格的位置(比如即使单元格为空也留个占位符),直接去掉
.filter(cell => cell !== "")即可; - 生成的文本文件默认存在Google Drive根目录,你可以替换成自己指定的文件夹ID,方便管理;
- 大表格也能高效处理,因为
getValues()是一次性读取所有数据,比逐个单元格读取快得多。
额外提示:
- 运行脚本前,记得给脚本授权(第一次运行会提示权限申请,按照步骤操作即可);
- 如果表格里的JSON内容有特殊字符,
JSON.parse会自动处理,不用担心格式问题,只要JSON本身语法正确就行。
内容的提问来源于stack exchange,提问作者Olga Ivanova




