【问题标题】:Extra commas after concatenating a range of cells in Sheet连接工作表中的一系列单元格后的额外逗号
【发布时间】:2021-08-04 01:00:43
【问题描述】:

供参考:这里是my Google Form

这里是a Google PE Blank Sheet,它与我的 Google 表单的输出相关联(答案将在表单响应 2 选项卡上输出)。


我已经建立了一个能够收集大量数据的 Google 表单。它是由经理为新员工申请 SAP 权限填写的。

他们继续通过表单并输入他们的主要部门(SAP 流),这将引导他们进入下一个页面/部分,允许经理检查员工所需的权限是什么。

有时,员工会与多个部门进行交互,因此支持/辅助 SAP 流的选项存在于第二页。这可以根据需要继续进行,直到将员工的所有必要角色/权限都收集到 Google 表格中。

在工作表中,您将看到:

  • A-F 列包含基本信息
  • H-T 列代表工作职责
  • U-AG 列是支持 SAP 流的信息范围
  • AH-AT 列是支持 SAP Stream 的工作职责
  • AU-BG 列收集辅助支持 SAP 流

我构建了 Google Script 语言来收集变量中的每一个信息位,然后将这些变量声明为全局变量,以便将它们传递到 App Script 中的 HTML 页面。

最后,包含此 HTML 页面的电子邮件将发送给负责指定 SAP 权限的经理。

my last update 以来一切正常。电子邮件被发送出去,变量正在从我定位的单元格范围内收集信息。但是输出中充满了分隔返回值的逗号。

Screenshot of email result

是不是将没有任何内容的单元格包含在内并用逗号分隔?还是我的变量做错了什么?


编辑:

这是我的代码中一些相关部分的示例:

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);

  }
});
}

全局变量被提取到一个 HTML 文件中 Google 脚本的一个单独部分,该文件通过电子邮件发送出去。生成的电子邮件如下所示:

Screenshot of email result

我想我可以将另一个函数或一些代码添加到值变量的行中,这将有助于避免 NULL 结果。

var valuesA = ss.getRange(i,8,1,13).getValues();

【问题讨论】:

  • 如果连接正在向为空的元素添加逗号,则可以使用过滤器方法将其删除。 Array.filter()
  • 这就是我从单元格范围收集数据的方式: var valuesA = ss.getRange(i,8,1,13).getValues();我应该做哪些修改才能做到你所说的?
  • 请在您的问题中发布minimal reproducible example,以便我重现问题
  • 我从代码中添加了几行代码,希望能对我正在做的事情有所了解。
  • 也许使用 GAS 的 filter() 函数的特定文档更容易,因为它已经将任何 null 值或空字符串作为目标并将其设置为 FALSE

标签: google-apps-script google-sheets


【解决方案1】:

您可以改用filterconcatjoin。在您的情况下,由于数据也是二维数组,您还需要在使用concat 之前对它们执行flat。检查下面的代码。使用concat 而不是直接使用+ 添加2个数组。我在 Logs and Output 部分比较了你的和下面的代码:

代码:

formSupportingSAP = supportingSAP.flat().concat(secondarySAP.flat()).filter(Boolean).join(", ");

日志和输出:

参考/注释:

  • flat() 获取等效的一维数组
  • concat() 合并两个数组
  • filter() 过滤掉空白单元格
  • join() 组合成一个带分隔符的字符串 ", "

【讨论】:

  • 太棒了!当我将变量声明为全局变量时,将“.flat().filter(Boolean).join(”、“)”应用到变量的末尾效果很好!谢谢!
  • 更感谢您提供参考资料/注释。我很高兴了解这是如何结合在一起的。仍在学习,但这就像在 Home Depot 并且不知道我可以为建筑项目选择什么工具。不过学习体验很棒。
  • 不客气@JeffAbrahams。我已经为您添加了它们,以便您个人了解它的工作原理并区分您所做的事情。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2020-09-12
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多