Оператор case не будет соответствовать тексту из столбца таблицы в скрипте Google Apps (скрипт внутри)

У меня есть форма Google и соответствующая таблица результатов. У меня есть скрипт Google Apps на листе, который нужно активировать при отправке формы. Он читает запись, помещает форматы заполненных столбцов в электронное письмо и отправляет это электронное письмо по указанному адресу. Все это работает как задумано.

Однако есть инструкция 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);
}

2 ответа

Проблема заключается в том, что когда вы читаете параметры из URL (также относится к именованным значениям), вам необходимо выполнить синтаксический анализ 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

e.namedValues ​​возвращает значения в массиве, а не в виде простых строк. Это позволяет поддерживать несколько значений для одного поля.

Это означает, что вам нужно сослаться на первый элемент в массиве в вашем операторе switch с индексом 0:

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

В противном случае вы используете Switch правильно.

Что касается вашего комментария, я не уверен, почему IF будет работать, когда Switch не работает, он также должен требовать доступа к элементу Array. Должно быть, что оператор IF неявно преобразует массив в строку для сравнения, в то время как оператор switch не имеет такого поведения.

Смотрите e.namedValues ​​здесь, значения указаны в записи Array:

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

Другие вопросы по тегам