Google sheets 当编辑的单元格值显示“时,自动发送电子邮件”;“完成”;电子邮件主题是编辑行中的第一个单元格
我试图写一个脚本,在编辑一个单元格时,自动向特定的人发送一封电子邮件,该单元格等于“完成”。但是,我希望主题是已编辑行的第一个单元格。包含“Done”的单元格总是在AA列中,我希望subject是同一行的A列。例:AA3已编辑,因此主题为A3。我花了数小时筛选教程,得出了以下结论:Google sheets 当编辑的单元格值显示“时,自动发送电子邮件”;“完成”;电子邮件主题是编辑行中的第一个单元格,google-sheets,scripting,Google Sheets,Scripting,我试图写一个脚本,在编辑一个单元格时,自动向特定的人发送一封电子邮件,该单元格等于“完成”。但是,我希望主题是已编辑行的第一个单元格。包含“Done”的单元格总是在AA列中,我希望subject是同一行的A列。例:AA3已编辑,因此主题为A3。我花了数小时筛选教程,得出了以下结论: function checkValue() { var sp = PropertiesService.getScriptProperties(); var ss = SpreadsheetApp.getAct
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');
}
函数onEdit(e)
{
var editRange={//AA2:AA1000
排名:2,
底部:1000,
左:27,
右:27
};
//如果超出范围,请退出
var thisRow=e.range.getRow();
if(thisRoweditRange.bottom)返回;
var thisCol=e.range.getColumn();
如果(thisColeditRange.right)返回;
var thisthang=e.值;
var doit='TRUE'
//我们在范围内;给编辑加时间戳
如果(thisthang==doit)
{
doFinish();
}
else{return};
}
函数onOpen()
{
var ui=SpreadsheetApp.getUi();
ui.createMenu('Finished')
.addItem('Finish','doFinish')
.addToUi();
}
函数doFinish()
{
var cell=SpreadsheetApp.getActiveSheet().getActiveCell();
var row=cell.getRow();
var活动=getCampaignFromRow(第1行);
var ui=SpreadsheetApp.getUi();
var response=ui.alert('Finish'+Campaign.name+'?',ui.ButtonSet.YES\u NO);
如果(响应==ui.Button.YES)
{
handleFinish(世界其他地区、运动);
}
如果(响应==ui.Button.NO)
{
电子表格app.getActiveSheet().getRange(第27行).setValue('FALSE');
}
}
函数GetActivityFromRow(行)
{
var values=SpreadsheetApp.getActiveSheet().getRange(第1行).getValues();
var rec=值[0];
var活动=
{
活动名称:rec[0]
};
Campaign.name=Campaign.Campaign\u name;
回归运动;
}
功能手柄完成(世界其他地区、活动)
{
var temp=HtmlService
.createTemplateFromFile(“活动电子邮件”);
模板活动=活动;
var message=temp.evaluate().getContent();
MailApp.sendmail({
致:“a***a@gmail.com",
主题:“活动已经结束!”,
htmlBody:消息
});
电子表格app.getActiveSheet().getRange(第27行).setValue('TRUE');
}
当电子表格在“Accts”表的“AA”列和值=“Done”中编辑时,您正试图触发一封电子邮件
最好的解决方案是使用onEdit
触发器,还可以使用事件对象
。在这种情况下,“简单触发器无法发送电子邮件”,因此您需要创建一个可安装的触发器
脚本的主要区别是:-
var-valueToCheck=sheet.getRange(“AA2:AA1000”).getValue()代码>
-这里有几件事。
-1)您试图获取列中的所有值,但使用了getValue
(单个单元格的方法)而不是getValues
-2)您可以定义ActiveCell并返回该值
-3)尽管您试图获取整列的值,但您的if
语句的设计方式似乎只有一个值,而不是一个值数组。
-4)这说明了使用事件对象的好处。您可以简洁地获取已编辑单元格和工作表的值。
-在if
比较中,使用“=”;这仅用于指定一个值。比较值时,必须使用“==”或“==”
-为了获得“subject”的值,脚本使用从事件对象派生的行号;与脚本中的偏移量相比,它们都是可以接受的。我使用了getRange
来演示替代方案。
-您的电子邮件正文被定义为“email.html”,但未声明。答案使用了一个非常简单的主体,但也可以很容易地使用另一个解决方案
大家好,欢迎光临。当然还有希望!!!请允许我澄清;如果我错了,请纠正我。你有一个谷歌表单文件;此文件可能有多个工作表,但在本例中,我们只对名为“Accts”的工作表感兴趣。每当编辑电子表格时,您都想知道编辑的单元格是否为i)在Sheet=“Accts”中,ii)在Column=AA3中,以及iii)值是否为=“Done”。如果是,则希望发送电子邮件(电子邮件主题位于编辑行的A列);如果没有,则不发送电子邮件。是。确切地除了它可能在AA列的任何地方。最简单的解决方案是“onEdit”,也可以使用它来提供有关编辑的信息。事件对象上的行数-偏移方法很好,但也可以使用getRange(行、列)
。由于getrange和Get值可能会(在时间上)非常昂贵,因此您最好先获取行gogetrange(行、列、numRows、numColumns)
,然后获取getValues,然后指定电子邮件所需的单元格。谢谢!我最终改变了一些变量,但这确实帮了大忙!多谢各位@AngelicaHernandez:如果你原来的问题解决了,请考虑一下。这是很有用的,因为这个社区依靠它向其他用户共享知识。
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");
}
}