for for循环和if语句用于多个条件

时间:2014-12-03 15:52:37

标签: google-apps-script google-sheets

我对if条件有一个令人头疼的时间。我将清楚说明这张纸是如何工作的。

当用户从E列,F列或G列的下拉菜单中选择一个值时,列H将更新为一个值。

它应该如何运作:

第1组 - 第E栏

第1组将选择"请求已发送"从下拉列表中。该脚本将执行setvalue" REQUEST_SENT"在H栏中。

第2组 - 第F栏

第2组将选择" Request Received"。该脚本将执行setvalue" REQUEST_RECEIVED"在H栏中。

第2组将选择"请求上传"。该脚本将执行setvalue" REQUEST_Uploading"在H栏中。

第2组将选择"上传已完成"。该脚本将执行setvalue" UPLOAD_COMPLETED"在H栏中。

第3组 - 第G栏

第2组将选择"请求转移"。该脚本将执行setvalue" REQUEST_TRANSFERRING"在H栏中。

第2组将选择"请求审核"。该脚本将执行setvalue" REQUEST_IN_REVIEW"在H栏中。

第2组将选择"请求审核完成"。该脚本将执行setvalue" REVIEW_COMPLETED"在H栏中。

第1组 - 第E栏

第1组将选择" Request Approved"或选择"请求被拒绝"从下拉列表中。该脚本将执行setvalue" REQUEST_APPROVED"或" REQUEST_REJECTED"在H栏中。

第2组 - 第F栏

如果第1组选择了#34;请求已批准"。第2组将选择" Burn in Progress"。该脚本将执行setvalue" BURN_IN_PROGRESS"在H栏中。

第2组将选择" Burn Completed"。该脚本将执行setvalue" BURN_COMPLETED"在H栏中。

第1组 - 第E栏

第1组将选择"请求发货"或者选择" Burn Rejected"从下拉列表中。该脚本将执行setvalue" REQUEST_SHIPPED"或者" BURN_REJECTED"在H栏中。

下面的脚本执行我想要的,但是当在E,F或G列中选择每个值时,H列值会根据E列或F列变为不同的值。

希望根据最后一列的选定值设置值。我已经考虑过为每个团队创建更新列,但这会使工作表更大。尽量保持表格紧凑。

以下是Google Spreadsheet

此处代码

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

如果您需要更多信息或说明,请与我们联系。任何帮助将非常感激。谢谢。

编辑12/4/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)脚本中时,没有任何反应。关于如何实现这一点的任何帮助。

编辑12/4/14#2 同样在前面的代码中,我能够根据E,F,G列中的下拉菜单选项发送电子邮件。因此,如果用户选择“请求已发送”,则会发送电子邮件。对于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 个答案:

答案 0 :(得分:1)

这对于Installable Edit Trigger函数来说是一个很好的应用程序。另见Google Sheets Events

请注意,您必须使用可安装的触发器,该触发器将作为文档所有者运行,而不是以匿名用户身份运行的简单onEdit() 触发器,因为发送电子邮件需要用户授权。

像这样(测试过):

function installableOnEdit( e ) {
  if (!e) throw new Error( "Need event parameter." ); // see http://stackoverflow.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://stackoverflow.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"
  });
}