如何修改Google Apps Script以限制Google Sheets导出的CSV内容:仅包含I6:I区域有值的条目
修改Google Apps Script:仅导出包含指定列有值的CSV条目
我看到你写了一个提交订单的Google Apps Script,现在想调整它,让导出的CSV只包含I6:I区域有值的行,而且如果这个区域全空的话,CSV就不带任何内容,同时保留原来清空I6:I的功能。作为新手,代码不规范完全没关系,咱们一步步来改~
修改后的完整脚本
function SUBMIT_ORDER() { // 获取当前活动表格和工作表,简化变量名(新手更易读) const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = ss.getActiveSheet(); const sheetName = activeSheet.getName(); // 获取格式化后的日期时间,用于邮件主题和文件名 const today = new Date(); const date = `${today.getFullYear()}-${String(today.getMonth()+1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`; const time = `${String(today.getHours()).padStart(2, '0')}:${String(today.getMinutes()).padStart(2, '0')}:${String(today.getSeconds()).padStart(2, '0')}`; const dateTime = `${date} ${time}`; // 邮件相关配置 const recipients = "EMAILADDRESS"; // 记得替换成你的实际收件邮箱 const userEmail = Session.getActiveUser().getEmail(); const subject = `BMVS ${sheetName} New Purchase Order ${dateTime}`; const body = `${userEmail} submitted a new purchase order for ${sheetName} on ${date} at ${time} ****THANK YOU****`; // 核心逻辑:筛选出I6:I有值的行 const dataRange = activeSheet.getDataRange(); // 获取工作表所有有数据的范围(避免处理完全空的行) const allData = dataRange.getValues(); // 把表格数据转成二维数组(每行是一个子数组) let filteredRows = []; // 遍历每一行,检查是否符合条件 for (let i = 0; i < allData.length; i++) { const rowNum = i + 1; // 转换成实际行号(数组索引从0开始,行号从1开始) const iColumnValue = allData[i][8]; // 获取I列的值(I是第9列,数组索引为8) // 只保留行号≥6,且I列不为空的行 if (rowNum >= 6 && iColumnValue !== "") { filteredRows.push(allData[i]); } } // 根据筛选结果处理邮件发送 if (filteredRows.length > 0) { // 把筛选后的数组转换成标准CSV格式(给单元格加双引号,避免逗号破坏格式) const csvContent = filteredRows.map(row => row.map(cell => `"${cell}"`).join(',')).join('\n'); // 发送带筛选后CSV的邮件 MailApp.sendEmail(recipients, subject, body, { attachments: [{ fileName: `${sheetName}-${dateTime}.csv`, content: csvContent, mimeType: "text/csv" // 修正原代码的mimeType拼写错误 }] }); } else { // 可选:如果没有符合条件的行,发送空订单提醒邮件(不需要的话可以删掉这段) MailApp.sendEmail(recipients, `BMVS ${sheetName} Empty Order Submission`, `No items were submitted for ${sheetName} on ${date} at ${time}.`); } // 保留原需求:清空I6:I区域 activeSheet.getRange("I6:I").clearContent(); // 保留原需求:回到E1单元格 ss.setCurrentCell(activeSheet.getRange('E1')); }
关键修改说明
- 简化重复代码:把原代码中重复调用的
SpreadsheetApp.getActiveSpreadsheet()和getActiveSheet()改成变量,减少冗余,更易维护。 - 规范日期格式:用
padStart(2, '0')确保月份、日期、时分秒都是两位数(比如1月变成01,9点变成09),避免格式混乱。 - 精准筛选行:
- 用
getDataRange()只获取表格中有实际数据的范围,不用遍历整个工作表的空行。 - 通过行号和I列值的双重判断,只保留符合要求的行。
- 用
- 自定义生成CSV:不再直接导出整个工作表,而是把筛选后的行转换成CSV,确保只包含需要的内容;给单元格加双引号,避免单元格内容包含逗号时破坏CSV格式。
- 处理空场景:如果I6:I全空,会发送提醒邮件(不需要的话可以直接删掉这段逻辑)。
- 修复细节错误:把原代码中写错的
application//csv改成标准的text/csv,确保邮件附件能被正确识别。
内容的提问来源于stack exchange,提问作者Scott Stevenson
相关产品推荐
相关产品推荐

