Google sheets 当编辑的单元格值显示“时,自动发送电子邮件”;“完成”;电子邮件主题是编辑行中的第一个单元格

Google sheets 当编辑的单元格值显示“时,自动发送电子邮件”;“完成”;电子邮件主题是编辑行中的第一个单元格,google-sheets,scripting,Google Sheets,Scripting,我试图写一个脚本,在编辑一个单元格时,自动向特定的人发送一封电子邮件,该单元格等于“完成”。但是,我希望主题是已编辑行的第一个单元格。包含“Done”的单元格总是在AA列中,我希望subject是同一行的A列。例:AA3已编辑,因此主题为A3。我花了数小时筛选教程,得出了以下结论: function checkValue() { var sp = PropertiesService.getScriptProperties(); var ss = SpreadsheetApp.getAct

我试图写一个脚本,在编辑一个单元格时,自动向特定的人发送一封电子邮件,该单元格等于“完成”。但是,我希望主题是已编辑行的第一个单元格。包含“Done”的单元格总是在AA列中,我希望subject是同一行的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');

}
函数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值可能会(在时间上)非常昂贵,因此您最好先获取行go
getrange(行、列、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");

  }
}