我目前正在开发一个 Google 脚本,当相关电子表格中的项目被标记为完成时,该脚本会向指定用户发送电子邮件。
第一个函数在编辑电子表格时触发,并检查第 5 列,如果匹配则移动该行。第一个 If 语句检查第 5 列,查看它是否与“Completed”匹配,如果匹配,则将其移至“COMPLETED”表。我能够成功地向所需的用户发送电子邮件,但我也尝试在电子邮件中包含所选行的第一列。
这导致我尝试使用项目属性,因为全局变量在 Google 脚本中是不可能的。但是,当尝试提取测试属性时,它会破坏脚本。
有谁知道我如何更正我的代码,以便能够将 A 列推送到一个函数中的项目属性并将其拉入一个单独的函数中?
使用项目属性的最初想法取自以下线程:如何在 Google Apps 脚本中定义全局变量
谢谢!
function onEditTrigger(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange()
// Below sends a completed project from the IN PROGRESS sheet to the COMPLETED sheet
if(s.getName() == "IN PROGRESS" && r.getColumn() == 5 && r.getValue() == "Completed") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("COMPLETED");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
// Send an email when a project is marked complete
sendEmail();
}
// Below sends a completed project from the COMPLETED sheet to the IN PROGRESS sheet
if(s.getName() == "COMPLETED" && r.getColumn() == 5 && (r.getValue() == "In Development" || r.getValue() == "On Hold" || r.getValue() == "Delayed")) {
var row2 = r.getRow();
var numColumns2 = s.getLastColumn();
var targetSheet2 = ss.getSheetByName("IN PROGRESS");
var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
s.getRange(row2, 1, 1, numColumns2).moveTo(target2);
s.deleteRow(row2);
}
}
// Code that establishes desired emails, subject
function sendEmail() {
var project = PropertiesService.getScriptProperties().getProperty('project');
var subject = "Learning Solutions project has been completed: " + project;
var emailAddress = "[email protected]";
MailApp.sendEmail(emailAddress,subject,"This is a test"
);
}
Google Apps 脚本支持全局变量,请参阅
Code.gs
这个简单示例:
var myGlobalVar = 'This is global var value';
function myFunction()
{
Logger.log(myGlobalVar);
}
运行函数
myFunction
,然后从脚本编辑器菜单中选择查看 - 日志,您将看到
[17-07-06 00:12:58:691 EEST] 这是全局变量值
我在调整后附加了代码,该代码允许我根据移动到已完成工作表的行的第一项动态填写要发送的电子邮件的主题。
function onEditTrigger(event) {
// assumes source data in sheet named Needed
// target sheet of move to named Acquired
// test column with yes/no is col 4 or D
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange()
// Below sends a completed project from the IN PROGRESS sheet to the COMPLETED sheet
if(s.getName() == "IN PROGRESS" && r.getColumn() == 5 && r.getValue() == "Completed") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("COMPLETED");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
//Added below code to pull the first value of the current row and map it to an object in the project properties
var project = s.getRange(row, 1,row,1).getDisplayValue();
PropertiesService.getScriptProperties().setProperty('project', project);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
// Send an email when a project is marked complete
sendEmail();
}
// Below sends a completed project from the COMPLETED sheet to the IN PROGRESS sheet
if(s.getName() == "COMPLETED" && r.getColumn() == 5 && (r.getValue() == "In Development" || r.getValue() == "On Hold" || r.getValue() == "Delayed")) {
var row2 = r.getRow();
var numColumns2 = s.getLastColumn();
var targetSheet2 = ss.getSheetByName("IN PROGRESS");
var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
s.getRange(row2, 1, 1, numColumns2).moveTo(target2);
s.deleteRow(row2);
}
}
// Code that establishes desired emails, subject
function sendEmail() {
//pulls down the 'project' property established earlier in the previous function and sets it as a variable in the new function
var project = PropertiesService.getScriptProperties().getProperty('project');
var subject = "Learning Solutions project has been completed: " + project;
var emailAddress = "[email protected]";
MailApp.sendEmail(emailAddress,subject,"This is a test"
);
}