【问题标题】:Case statement won't match text from spreadsheet column in Google Apps script (script inside)案例语句与 Google Apps 脚本(内部脚本)中电子表格列中的文本不匹配
【发布时间】:2015-09-22 19:09:22
【问题描述】:

我有一个谷歌表格和相应的结果电子表格。我在表单上有一个谷歌应用程序脚本,旨在在表单提交时激活。它读取条目,将填写的列格式放入电子邮件中,然后将该电子邮件发送到指定地址。所有这些都按预期工作。

但是,有一个 case 语句应该根据其中一列中的文本设置目标电子邮件地址和主题行。除了默认情况外,我无法让它读取任何内容。列(“校园”列)中的文本似乎与案例陈述相匹配?有人有建议吗?谢谢!

function SendGoogleForm(e) {

  if (MailApp.getRemainingDailyQuota() < 1) return;

  var s = SpreadsheetApp.getActiveSheet();
  var columns = s.getRange(1, 1, 1, s.getLastColumn()).getValues()[0];     
  var email = "";
  var subject = "";
  var message = "";

  switch (e.namedValues["Campus"]){
    case "Lower School":
      email = "xxxx@*****.org";
      subject = "LS Ticket Created";
      message = "Campus column is: " + e.namedValues["Campus"] + "\n";
      message += "Case is: Lower School"+"\n";
      break;
    case "Upper School":
      email = "yyyy@*****.org";
      subject = "US Ticket Created";
      message = "Campus column is: " + e.namedValues["Campus"] + "\n";
      message += "Case is: Upper School"+"\n";
      break;        
    case "S*******":
      email = "zzzz@*****.org";
      subject = "SC Ticket Created";
      message = "Campus column is: " + e.namedValues["Campus"] + "\n";
      message += "Case is: S*******"+"\n";
      break;
    default:
      email = "xxxx@*****.org";
      subject = "General Ticket Created";
      message = "Campus column is: " + e.namedValues["Campus"] + "\n";
      message += "Case is: Default"+"\n";
      break;
  }

  for (var keys in columns) {
        var key = columns[keys];
        if (e.namedValues[key] && (e.namedValues[key] !== "")) {
            message += key + ' :: ' + e.namedValues[key] + "\n\n";
        }
    }

    MailApp.sendEmail(email, subject, message);
}

【问题讨论】:

  • 肯定是case语句的问题。以下代码返回 true if (e.namedValues["Campus"] == "Lower School"){ (假设“Lower School”在校园列中,因此它们应该匹配。我显然不了解 case 语句如何匹配。我可以执行嵌套 if-else 语句,但我不明白“案例”的正确含义,这让我很烦恼。想法?

标签: google-apps-script case-statement


【解决方案1】:

e.namedValues 返回数组中的值,而不是简单的字符串。这允许它支持单个字段的多个值。

这意味着您需要在 switch 语句中引用数组中的第一项,索引为 0:

  switch (e.namedValues["Campus"][0]){
     ...
  }

否则你使用 Switch 是正确的。

关于您的评论,我不确定为什么 IF 会在 Switch 不工作时工作,它还应该要求您访问 Array 元素。一定是 IF 语句为了比较而隐式地将 Array 转换为字符串,而 switch 语句没有这种行为。

在此处查看 e.namedValues,其值以数组表示法显示:

https://developers.google.com/apps-script/guides/triggers/events

【讨论】:

    【解决方案2】:

    问题在于,当您从 URL 读取参数时(也适用于“namedvalues”),您需要解析为 int 或 string 或适当的类型,除此之外,switch/case 的使用是正确的。

    选项:

     1. var input = 1; //int
     2. var input = "myvalue"; //string
     3. var input = parseInt(e.parameters.input); 
        //parsed int from querystring. http://.../?input=1
     4. var input = e.parameters.input.toString(); 
        //parsed string from querystring. http://.../?input=myvalue
     5. var input = e.parameters.input;  
        //Not parsed int or string from query string. 
        //http://.../?input=1 or http://.../?input=myvalue
        //This option will not work unless you parse to the appropriate type.
    
    switch (input){
        case 1:
        //This works for option 1 and 3;
        break;
        case "myvalue":
        //This works for option 2 and 4;
        break;
        default:
        //Option 5 will fall here;
        break;
    }
    

    参考资料:

    URL Parameters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多