当编辑的单元格值显示"Done"并且电子邮件主题是编辑行中的第一个单元格时自动发送电子邮件



我正在尝试编写一个脚本,其中在编辑单元格时自动向特定人员发送电子邮件,并且单元格等于"完成"。但是,我希望主题是编辑行的第一个单元格。包含"完成"的单元格将始终位于 AA 列中,我希望主题是同一行的 A 列。例如:AA3 已编辑,因此主题为 A3。我花了几个小时筛选教程并提出了这个:

function checkValue() {
var sp = PropertiesService.getScriptProperties();
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Accts");
var valueToCheck = sheet.getRange("AA2:AA1000").getValue();
if (valueToCheck = 'Done') {
MailApp.sendEmail("a***a@gmail.com", activeCell.offset(-26,0).getValue(), Email.html);
}
}

我这样做是完全错了还是有希望?

编辑: 现在它已经解决了。我想我会分享我的脚本最终的样子。我添加了一个 UI 和一个使用菜单选项执行的选项。希望这对其他人有所帮助。

function onEdit(e) 
{
var editRange = { // AA2:AA1000
top : 2,
bottom : 1000,
left : 27,
right : 27
};
// Exit if we're out of range
var thisRow = e.range.getRow();
if (thisRow < editRange.top || thisRow > editRange.bottom) return;
var thisCol = e.range.getColumn();
if (thisCol < editRange.left || thisCol > editRange.right) return;
var thisthang = e.value;
var doit = 'TRUE'
// We're in range; timestamp the edit
if(thisthang == doit)
{
doFinish();
}
else{return};
} 
function onOpen()
{
var ui = SpreadsheetApp.getUi();
ui.createMenu('Finished')
.addItem('Finish', 'doFinish')
.addToUi();
}
function doFinish()
{
var cell = SpreadsheetApp.getActiveSheet().getActiveCell();
var row = cell.getRow();
var Campaign = getCampaignFromRow(row, 1); 
var ui = SpreadsheetApp.getUi();
var response = ui.alert('Finish '+Campaign.name+'?', ui.ButtonSet.YES_NO);
if(response == ui.Button.YES)
{
handleFinish(row, Campaign);
}
if(response == ui.Button.NO)
{
SpreadsheetApp.getActiveSheet().getRange(row, 27).setValue('FALSE');
}
}
function getCampaignFromRow(row)
{
var values = SpreadsheetApp.getActiveSheet().getRange(row, 1).getValues();
var rec = values[0];
var Campaign = 
{
Campaign_Name: rec[0]
};
Campaign.name = Campaign.Campaign_Name;
return Campaign;
}
function handleFinish(row, Campaign)
{
var templ = HtmlService
.createTemplateFromFile('Campaign-email');
templ.Campaign = Campaign;
var message = templ.evaluate().getContent();
MailApp.sendEmail({
to: "a***a@gmail.com",
subject: "A Campaign has been finished!",
htmlBody: message
});
SpreadsheetApp.getActiveSheet().getRange(row, 27).setValue('TRUE');
}

您正在尝试在"会计"工作表的"AA"列中编辑电子表格时触发电子邮件,值 = "完成"。

最好的解决方案是使用onEdit触发器并利用Event Objects.在这种情况下,"简单触发器无法发送电子邮件"引用,因此您需要创建一个可安装触发器。

与脚本的主要区别是: -
var valueToCheck = sheet.getRange("AA2:AA1000").getValue();
- 这里有几件事。
- 1(您正在尝试获取列中的所有值,但是您使用getValue(单个单元格的方法(而不是getValues。-
2(您可以定义ActiveCell并返回该值
- 3(尽管您尝试获取整个列的值,但if语句的设计就好像只有一个值而不是一个值数组。
- 4(这演示了使用事件对象的好处。您可以简洁地获取编辑过的单元格和工作表的值。
- 在if比较中,您使用"=";这仅用于分配值。比较值时,必须使用"=="或"==="。-
为了获取"主题"的值,脚本使用从事件对象派生的行号;与脚本中的偏移量相比 - 它们都是可以接受的。我使用getRange来演示替代方案。
- 您的电子邮件正文被定义为"电子邮件.html",但未声明。答案使用非常简单的主体,但同样可以轻松使用另一种解决方案。


function so5967209001(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet()
// establish the values to be checked
var checkSheetname = "Accts"
var checkValue = "Done"
var checkColumn = 27; // column AA
// this will return the event objects
//Logger.log(JSON.stringify(e)); // DEBUG
// variables to use for checking
var editedrange = e.range;
var editedrow = editedrange.getRow();
var editedcolumn = editedrange.getColumn();
var editedsheet = editedrange.getSheet().getSheetName();
var editedvalue = e.value;
//Logger.log("DEBUG: row = "+editedrow+", column = "+editedcolumn+", sheet = "+editedsheet+", value"+editedvalue)
// test the sheet, the column and the value
if (editedsheet ==checkSheetname && editedcolumn==checkColumn && editedvalue == checkValue){
//Logger.log("DEBUG: this is a match");
var subject = sheet.getRange(editedrow,1).getValue(); // Column A of the edited row
//Logger.log("DEBUG: email subject = "+subject);
// build your own body
var body = "this is the body of the email"
// send the email
MailApp.sendEmail("ejb@tedbell.com.au", subject, body);
//Logger.log("DEBUG: mail sent")
}else{
//Logger.log("DEBUG: this isn't a match");
}
}

相关内容

最新更新