根据行数据填充列

时间:2015-10-10 16:28:55

标签: google-apps-script google-sheets

我希望使用按钮在Google表格中运行脚本。当按下按钮时,我想要一个列填充"已批准"对于给定的行,基于已登录的用户以及该行中列出的电子邮件。

例如,列A包含不同电子邮件地址的列表。按下按钮,B列填充"已批准"如果您的登录电子邮件地址与A列中的相同。理想情况下,它可以搜索并确保B列中的条目未填充"已拒绝"。考虑一个主管通过列表,而不是使用下拉菜单来批准"批准"在每一行上,他们可以点击一个按钮,它会批准他们的电子邮件附加到的所有条目。

我有它工作,但它通过每一行,评估,然后填充适当的列,它是缓慢和低效的。它也没有为最后一行数据设置批准。它贯穿每一行,填充,但不会在输入的最后一行数据上填写Approved。

我想弄清楚如何使用数组来提高效率。

这是我到目前为止所做的:

function supervisorApproval(){
//This function will approve all of the peole in the respected supervisors section

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("AS");

var approverLogin = Session.getActiveUser().getEmail();
var ui = SpreadsheetApp.getUi();

//Calculate which row is the last row (last entry)
var column = sheet.getRange('W:W');
var values = column.getValues();
var lastrow = 1;

//this is inefficient code, doesn't write "approved" for last row of data
while (values[lastrow][0] != ""){
var supEmail = sheet.getRange(lastrow, 23).getValue();
var approvalCell = sheet.getRange(lastrow, 27);

if (approverLogin == supEmail){
  approvalCell.setValue("Approved");
}

lastrow++;
}

} 

1 个答案:

答案 0 :(得分:0)

如果您只在电子表格中读取和写入一次值,则速度应该快得多。试试这个。

function supervisorApproval() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("AS");

  var approverLogin = Session.getActiveUser().getEmail();
  var ui = SpreadsheetApp.getUi();

  var range = sheet.getRange(1, 23, sheet.getLastRow(), 5);
  var values = range.getValues();
  for(var i = 0; i < values.length; i++) {
    var row = values[i];
    var supEmail = row[0];
    if (approverLogin === supEmail){
      row[4] = "Approved";
    }
  }
  range.setValues(values);
}