即使表单字段更改,也可在Sheet中查找正确的列。动态映射Sheet列以更正数据

时间:2016-01-30 07:58:40

标签: google-apps-script google-sheets

function onFormSubmit() {
  ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var fRes1 = ss.getSheetByName("Form Responses 1");

   function sendEmail() 
  {    
    var emailManager = ""; 
    var emailQuality = "";
    var sheet = SpreadsheetApp.getActiveSheet();
    var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];    
    var Row = sheet.getRange(sheet.getLastRow(),1,1,sheet.getLastColumn()).getValues()[0]; //Last Row
    var message = "";
    var subject = Row[2]; //Subject is on column 3

    for(var i in headers) 
    if(Row[i] !== "")
    {  
        message += headers[i] + Row[i] + "/n/n"; // Headers and Last Row will be the message
    }
    // Improvement Suggestion
    if(Row[2] === 'Improvement suggestion')
    {
    emailManager = Row[10];  //column where the header is called "Manager Email"       
    } 

    // Incident
    else if(Row[2] === 'Incident')
    {
      emailManager = Row[21];   //column where the header is called "Who should be informed?"

      if(Row[11] === "Option1")  // 
      {
       emailQuality = "emailaddress1@address.com"; 
      }

      else if (Row[11] === "Option2")
      {
       emailQuality = "emailaddress1@address.com"; 
      }
    }

    // Send the email
    MailApp.sendEmail(emailQuality + "" + emailManager, subject, message);

  }

  sendEmail();
}

是否有更通用的方法从表格提交信息的电子表格中提取信息?

而不是使用如下数字:

emailManager = Row[10];
subject  = Row[2];
if(Row[11] === "Option1")

因为如果有人更改了表单,将添加或删除新列,然后我将不得不使用另一个数字。 是否有更通用的方法来了解哪一列包含哪些选项?

1 个答案:

答案 0 :(得分:1)

有多种方法,每种方法都有自己的复杂性和实用性。所有这些都允许列在任何地方,因此可以扩展表单。

的indexOf

如果您不在代码中执行此操作,则可以使用

访问行r的值
var resultT = a[r][a[0].indexOf("Col2")] // Access "Col2" of row r

索引对象

如果您更频繁地执行此操作并希望避免索引(也可能在计算上变得非常昂贵),您可以创建一个包含标题名称和列信息的Object:

  var I = {}; // Indexing object

  for (var i = 0; i < a[0].length; i++) { // Assign indices to headers
    I[a[0][i]] = i; 
  }

  var result = a[r][I["Col2"]] // Access "Col2" of row r

或者在你的情况下

subject  = Row[2];
var result = subject[I["Option1"]];

表对象

最容易使用的选项但设置起来非常繁琐,是在Index对象上进行扩展而只是追加转换数据数组的元素而不是索引列。

var table = {}
  for (var row = 0; row < a.length; row++) {
    for (var col = 0; col < a[row].length; col++) {
      if (row == 0) {
        table[a[0][col]] = [];
      } else {
        table[a[0][col]].push(a[row][col]); 
      }
    }
  }

var result = table["Col2"][r-1];

您现在有一个带有列标题的对象,每个对象都包含该列的数组(请注意,这不会改变索引,因为标题不再计为行) 这要求我们至少访问一次每个元素,并且需要执行大量工作。如果你要经常访问这些元素,这是值得的 我个人推荐选项2。