Google Sheet单元格范围拼接后出现多余逗号的解决方法求助
- 我的Google Form
- 空白Google PE Sheet,已绑定Google Form的输出数据(表单回答将输出至Form Responses 2标签页)
我搭建了一个用于收集数据的Google Form,供经理为新员工申请SAP权限时填写。
经理填写完主部门(SAP Stream)后会进入下一个页面,勾选员工所需的权限项。部分员工需要对接多个部门,因此第二页设有辅助/二级SAP Stream选项,可按需添加直至员工所有所需角色/权限都收集完成并同步到Google Sheet中。
Sheet列规则
- A-F列为基础信息
- H-T列为岗位职责
- U-AG列为辅助SAP Stream信息
- AH-AT列为辅助SAP Stream对应的岗位职责
- AU-BG列为二级辅助SAP Stream信息
我编写了Google Script代码将上述信息存入变量,声明为全局变量后传递给App Script的HTML页面,最终将包含该HTML页面的邮件发送给负责分配SAP权限的经理。
自从上次更新后功能整体运行正常:邮件可正常发送,变量也能正常读取目标单元格范围的内容,但输出内容里存在大量分隔返回值的逗号。
邮件输出结果截图
请问这个问题是因为空单元格被纳入计算并被逗号分隔导致的吗?还是我的变量设置存在其他错误?
编辑补充
相关代码片段如下:
function sendEmail_v3() { // get the spreadsheet information const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //const responseSheet = ss.getSheetByName('Form Responses 1'); const data = ss.getDataRange().getValues(); //console.log(data); // Loop over the rows data.forEach((row,i) => { // Identify whether notification has been sent if (row[59] === '') { // Get the Form info var emailTo = "xxxxxx@gmail.com" var subject = 'SAP Role Request Subject'; const Timestamp = row[0]; var emailAddress = row[1]; var name = row[2]; var department = row[3]; var userID = row[4]; var SAP_Stream = row[5]; var valuesA = ss.getRange(i,8,1,13).getValues(); var jobResponsibilities = valuesA; var valuesB = ss.getRange(i,21,1,13).getValues(); var supportingSAP = valuesB; var valuesC = ss.getRange(i,34,1,13).getValues(); var secondaryJob = valuesC; var valuesD = ss.getRange(i,47,1,13).getValues(); var secondarySAP = valuesD; formTime = Timestamp; formEmail = emailAddress; formName = name; formUserID = userID; formSAP_Stream = SAP_Stream; formDepartment = department; formResponsibilities = jobResponsibilities; formSupportingSAP = supportingSAP + "," + secondarySAP; formSecondaryJob = secondaryJob; let body = ''; // Write the email in email.html var html = HtmlService.createTemplateFromFile("email.html"); var htmlText = html.evaluate().getContent(); var options = {htmlBody: htmlText}; // Send the email GmailApp.sendEmail(emailTo,subject,'',{htmlBody: htmlText}); // Mark as Notified const g = 'Notification sent'; ss.getRange(i + 1,60).setValue(g); } }); }
上述全局变量会被引入Google Script的HTML文件中作为邮件内容发送,生成的邮件效果见截图。我想可以在取值的代码行新增函数或代码过滤空值,比如在var valuesA = ss.getRange(i,8,1,13).getValues();这一行做修改,请问该如何实现?
解答
问题原因
多余逗号确实是空单元格导致的:
getValues()返回的是二维数组,单行13列的数据格式为[[值1, 值2, 空, 空, ...]]- 直接把数组赋值给变量、用
+拼接数组时,JS会自动调用数组的toString()方法,空值会被转为空字符串,数组元素之间自动用逗号分隔,就会出现连续的逗号。
修复方案
你可以在获取数组后直接拍平、过滤空值,再按照你需要的分隔符拼接成字符串,修改后代码如下:
// 原来的写法 // var valuesA = ss.getRange(i,8,1,13).getValues(); // var jobResponsibilities = valuesA; // 修改后的写法:拍平二维数组→过滤空值→用顿号/换行等你需要的分隔符拼接 var valuesA = ss.getRange(i,8,1,13).getValues().flat().filter(item => item?.trim() !== ''); var jobResponsibilities = valuesA.join('、'); // 可以换成'\n'换行,根据你邮件的展示需求调整 // 其他几个取值的地方同理修改即可 var valuesB = ss.getRange(i,21,1,13).getValues().flat().filter(item => item?.trim() !== ''); var supportingSAP = valuesB.join('、'); var valuesC = ss.getRange(i,34,1,13).getValues().flat().filter(item => item?.trim() !== ''); var secondaryJob = valuesC.join('、'); var valuesD = ss.getRange(i,47,1,13).getValues().flat().filter(item => item?.trim() !== ''); var secondarySAP = valuesD.join('、'); // 原来的formSupportingSAP拼接可以改成这样,避免两个变量都为空时多出来的逗号 formSupportingSAP = [supportingSAP, secondarySAP].filter(item => item !== '').join('、');
额外优化建议
你已经通过data = ss.getDataRange().getValues()拿到了全表的数据,不需要在循环里反复调用getRange()读单元格,直接用已经拿到的row数组取值即可,能大幅提升脚本运行效率:
// 比如valuesA是第8列到第20列(对应数组索引7到19,因为数组从0开始计数),直接从row里取对应区间就行 var valuesA = row.slice(7,20).filter(item => item?.trim() !== '');
内容的提问来源于stack exchange,提问作者Jeff Abrahams

