Для цикла и оператора if для нескольких условий

У меня есть время чесать голову с условиями если. Я поясню, как лист должен работать.

Когда пользователи выбирают значение из раскрывающихся меню в столбце E, столбце F или столбце G. Будет обновляться значение столбца H.

Как это должно работать:

Команда 1 - Колонна E

Команда 1 выберет "Запрос отправлен" из выпадающего списка. Сценарий выполнит заданное значение "REQUEST_SENT" в столбце H.

Команда 2 - Колонна F

Команда 2 выберет "Запрос получен". Сценарий выполнит заданное значение "REQUEST_RECEIVED" в столбце H.

Команда 2 выберет "Запрос загрузки". Сценарий выполнит заданное значение "REQUEST_Uploading" в столбце H.

Команда 2 выберет "Загрузка завершена". Сценарий выполнит заданное значение "UPLOAD_COMPLETED" в столбце H.

Команда 3 - Колонна G

Команда 2 выберет "Запрос на передачу". Сценарий выполнит заданное значение "REQUEST_TRANSFERRING" в столбце H.

Команда 2 выберет "Запрос в обзоре". Сценарий выполнит заданное значение "REQUEST_IN_REVIEW" в столбце H.

Команда 2 выберет "Запрос на проверку завершен". Сценарий выполнит заданное значение "REVIEW_COMPLETED" в столбце H.

Команда 1 - Колонна E

Команда 1 выберет "Запрос одобрен" или "Запрос отклонен" из выпадающего списка. Сценарий выполнит заданное значение "REQUEST_APPROVED" или "REQUEST_REJECTED" в столбце H.

Команда 2 - Колонна F

Если команда 1 выбрала "Запрос одобрен". Команда 2 выберет "Burn in Progress". Сценарий выполнит заданное значение "BURN_IN_PROGRESS" в столбце H.

Команда 2 выберет "Запись завершена". Сценарий выполнит заданное значение "BURN_COMPLETED" в столбце H.

Команда 1 - Колонна E

Команда 1 выберет "Запрос отправлен" или выберет "Отклонить запись" в раскрывающемся списке. Сценарий выполнит заданное значение "REQUEST_SHIPPED" или "BURN_REJECTED" в столбце H.

Сценарий ниже выполняет то, что я хочу, но когда каждое значение выбирается в столбце E, F или G, значение столбца H изменяется на другое значение в зависимости от столбца E или столбца F.

Хотелось бы, чтобы значение было установлено на основе выбранного значения последнего столбца. Я думал о создании столбцов обновления для каждой команды, но это сделает лист еще больше. Старайтесь держать лист компактным.

Вот таблица Google

Вот код

Team 1
var REQUEST_SENT = "REQUEST_SENT";
var REQUEST_APPROVED = "REQUEST_APPROVED";
var REQUEST_REJECTED = "REQUEST_REJECTED";
var REQUEST_SHIPPED = "REQUEST_SHIPPED";
var BURN_REJECTED = "BURN_REJECTED";
var REQUEST_CANCELLED = "REQUEST_CANCELLED";

//Team 2
var REQUEST_RECEIVED = "REQUEST_RECEIVED";
var REQUEST_TRANSFERRING = "REQUEST_TRANSFERRING";
var REQUEST_COMPLETED = "REQUEST_COMPLETED";

//Team 3
var REQUEST_IN_REVIEW = "REQUEST_IN_REVIEW";
var PM_REVIEW = "PM_REVIEW";
var REQUEST_TRANSFERRING = "REQUEST_TRANSFERRING";
var BURN_IN_PROGRESS = "BURN_IN_PROGRES";
var BURN_COMPLETED = "BURN_COMPLETED";

function pmSendEmails() {
  var ss1 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var ss2 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];
  Logger.log('Sheet1: '+ss1.getSheetName());
  Logger.log('Sheet2: '+ss2.getSheetName());

  var startRow = 2;
  var lastRow1 = ss1.getLastRow()-1;
  var lastRow2 = ss2.getLastRow()-1;
  var range1 = ss1.getRange(startRow, 1, lastRow1, 8);
  var range2 = ss2.getRange(startRow, 1, lastRow2, 3);

  var data1 = range1.getValues();
  var data2 = range2.getValues();

  var addresses = [];
     for (var i = 0; i < data2.length; ++i){
       var row2 = data2[i];
       var cc = row2[1];
       var replyTo = row2[2];
       addresses.push([cc,replyTo])
     }

  var html;

     for (var i = 0; i < data1.length; ++i){
       var row1 = data1[i];
       var projectName = row1[0];
       var projectID = row1[1];
       var projectManager = row1[2];
       var dueDate = Utilities.formatDate(new Date(row1[3]), "America/New_York", "MMMM dd, yyyy");
       var team1 = row1[4];
       var team2 = row1[5];
       var team3 = row1[6];
       var status = row1[7];
 }

Здесь мне нужно поместить оператор if и условия для обновления столбца H

if (condition =="" && (condition !=)){
}

Также приведенный ниже код будет выполняться, если условия верны.

   var subject = "New DVD Request" + projectName + " ("+projectID+")";
   var user = Session.getActiveUser().getEmail();
   var timestamp = Utilities.formatDate(new Date(), "America/New_York", "MMMM dd, yyyy HH:mm");
   var comments1 = ss1.getRange(startRow + i, 5).getNote();
   comments1 = comments1 + "Request Sent:\n" + user + "\n" + timestamp + "\n";             
   var comments = ss1.getRange(startRow + i, 8).getNote();
   comments = comments + "EMAIL_SENT:\n" + timestamp + "\n";       
   html = projectName+" "+projectID+" "+projectManager+" "+dueDate;       
   var setdata = ss1.getRange(startRow + i, 8).setValue(EMAIL_SENT).setNote(comments);
   var team1Update = ss1.getRange(startRow + i, 5).setNote(comments1);
   var optAdvancedArgs = {replyTo: replyTo, cc: user, name: "Venue Client Services"};
   SpreadsheetApp.flush();
   //MailApp.sendEmail(projectManager, subject, html, optAdvancedArgs);

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или разъяснения. Любая помощь приветствуется. Спасибо.

Редактировать 04.12.14 #1 Пара вещей, которые я хочу осуществить. Всякий раз, когда ячейка редактируется с диапазоном столбцов E, F. G и H, добавляется заметка с адресом электронной почты и отметкой времени активного пользователя. В моем предыдущем коде я смог добиться этого с помощью приведенного ниже кода.

   var user = Session.getActiveUser().getEmail();
   var timestamp = Utilities.formatDate(new Date(), "America/New_York", "MMMM dd, yyyy HH:mm");
   var comments1 = ss1.getRange(startRow + i, 5).getNote();
   comments1 = comments1 + "Request Sent:\n" + user + "\n" + timestamp + "\n";             
   var comments = ss1.getRange(startRow + i, 8).getNote();
   comments = comments + "EMAIL_SENT:\n" + timestamp + "\n";
   var setdata = ss1.getRange(startRow + i, 8).setValue(EMAIL_SENT).setNote(comments);
   var team1Update = ss1.getRange(startRow + i, 5).setNote(comments1);

comments1 устанавливает примечание для выпадающих выборок в столбцах E, F, G, а комментарии устанавливает примечание для столбца H. Когда я помещаю приведенный выше код в текущий скрипт onEdit (e), ничего не происходит. Любая помощь о том, как я могу это реализовать.

Edit 12/4/14 # 2 Также в предыдущем коде я смог отправить электронные письма на основе выпадающего меню в столбцах E, F, G. Поэтому, если пользователи выбирают Request Sent, электронное письмо отправляется. Это повторяется для всех пунктов раскрывающегося меню в столбцах E, F, G. Любая помощь в том, как я могу реализовать MailApp для каждого выбора.

   var html = projectName+" "+projectID+" "+projectManager+" "+dueDate;       
   var optAdvancedArgs = {replyTo: replyTo, cc: user, name: "Venue Client Services"};
   MailApp.sendEmail(projectManager, subject, html, optAdvancedArgs);

1 ответ

Решение

Это было бы хорошим приложением для устанавливаемой функции редактирования запуска. Смотрите также Google Sheets Events.

Обратите внимание, что вы должны использовать устанавливаемый триггер, который будет работать как владелец документа, а не простойonEdit() триггер, который запускается как анонимный пользователь, потому что отправка электронного письма требует авторизации пользователя.

Примерно так (проверено):

function installableOnEdit( e ) {
  if (!e) throw new Error( "Need event parameter." ); // see http://stackru.com/a/16089067

  var changedCell = e.range;
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var sheet = e.range.getSheet();

  var headers = sheet.getDataRange().getValues()[0]; // Get header row 1
  var statusCol = headers.indexOf('Reminder Email Status')+1;
  // Build an array of "rows we care about". If the headers change, this needs to be updated
  var teamCols = [ headers.indexOf('Team 1 (PM)')+1,
                   headers.indexOf('Team 2 (Colombo)')+1,
                   headers.indexOf('Team 3 (VCS)')+1 ];

  if (teamCols.indexOf(col) == -1) return;  // Exit if cell outside of the team columns

  var status = e.value.toUpperCase().replace(/ /g,"_");   // Change "Request Sent" to "REQUEST_SENT"
  sheet.getRange(row,statusCol).setValue(status);

  //--------- Put your emailing code here, or call a function
}

// Read user's current cell, and feed to installableOnEdit() as an event.
// see http://stackru.com/a/16089067
function test_installableOnEdit() {
  installableOnEdit({
    user : Session.getActiveUser().getEmail(),
    source : SpreadsheetApp.getActiveSpreadsheet(),
    range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
    value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
    authMode : "LIMITED"
  });
}
Другие вопросы по тегам