You need to enable JavaScript to run this app. Google Sheet单元格范围拼接后出现多余逗号的解决方法求助
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheet单元格范围拼接后出现多余逗号的解决方法求助

参考信息

我搭建了一个用于收集数据的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();这一行做修改,请问该如何实现?


解答

问题原因

多余逗号确实是空单元格导致的:

  1. getValues()返回的是二维数组,单行13列的数据格式为[[值1, 值2, 空, 空, ...]]
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 16:36:01