我希望使用按钮在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++;
}
}
答案 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);
}