我如何得到循环通过一个列,当一个特定的值被击中,电子邮件是基于在同一行的值发送,这样做的集合范围? &



我是新来的编码,特别是使用谷歌脚本。我有一个包含文档和文档id的电子表格,当到期日期过期时,它会变成红色,就像交通灯系统一样。

然而,我需要为工作设置的是当列L = 1中的值(基于行中的红色和其他值为真)时要发送的自动电子邮件,如果值为0,我希望脚本通过它并向下移动。

我试着阅读和测试代码周围使用do和while和for等,但我只是不能让它工作。

所以我所设置的是低效和基本的,我敢肯定,但它工作,只是缓慢-见下面的代码。

当它遇到1时,它使用激活单元格和偏移量从相应行的单元格中获取值,并打包电子邮件并发送。然后,脚本向下移动并检查下一个单元格,但由于我使用activate并调用多个函数,因此需要很长时间才能循环遍历该列。

列为L,使用范围为L2:L60

如果有人能给我指出正确的方向,最好的方法是什么,我将非常感激。

function Findfirstcell() 
{
SpreadsheetApp.getActive().getRange('l2').activate();
GetLvalue();  
}
function GetLvalue() 
{
var st= SpreadsheetApp.getActive().getActiveSheet().getActiveCell().getValue();
if (st < 1)
Movetonext();
else
Createemail();
}
function Createemail() 
{
var ss= SpreadsheetApp.getActive()
var x = ss.getActiveSheet()
const s= x.getActiveCell();
var y= s.offset(0,-5);
var v= y.getValue();
var t= s.offset(0,-10);
var z= s.offset(0,-11);
var p= t.getValue();
var w= z.getValue();
var emailAddress = v+'@gmail.com'
var message = p+" is overdue - Document ID  "+w
var subject = w+"  is Overdue"
MailApp.sendEmail(emailAddress, subject, message);
var w= s.offset(0,-3);
w.setValue('Sent')
var end= s.offset(1,0);
end.activate();
GetLvalue();
}
function Movetonext()
{
var ss= SpreadsheetApp.getActive();
var s= ss.getActiveSheet().getActiveCell();
var end= s.offset(1,0);
end.activate();
var v= s.getValue();
if (v < 0) 
ss.getRange('a1').activate();
else
GetLvalue();
}

我已经尝试了几种其他方法,但没有成功,如下所述,其中一个是对第一行执行(这可能是因为值为1),但它没有继续向下列。我假设条件已经失败,触发函数createemail并且没有什么可以循环它

function Findfirstcell() 
{
var ss= SpreadsheetApp.getActiveSheet().getActiveCell('l2').activate;
// Or 
var ss= SpreadsheetApp.getActiveSheet().getRange('l2:l60');
for(ss<0; ss>0; ss++){createemail();}
}
function createemail()
{
var st= SpreadsheetApp.getActive().getCurrentCell();
var y= st.offset(0,-5);
var v= y.getValue();
var t= st.offset(0,-10);
var z= st.offset(0,-11);
var p= t.getValue();
var w= z.getValue();
var emailAddress = v+'@gmail.com'
var message = p+" is overdue - Document ID  "+w
var subject = w+"  is Overdue"
MailApp.sendEmail(emailAddress, subject, message);
}

如有任何指导,将不胜感激

我相信你的目标是这样的。

  • 您要检查列的值是否为"L"为01
  • 当值为1且列";I"不是Sent,则希望使用"A", "B"列的值发送电子邮件。和"G">
  • 发送邮件时,要将Sent的值放到&;i &;列中
  • 你想要减少脚本的处理成本。

在这种情况下,下面的流程如何?

  1. 从活动工作表中检索值
  2. 检查列"I"的值和";L",发送电子邮件并返回范围列表。
  3. 当邮件发送时,"已发送"的值;放到"I"列。

当这个流被反射到Google Apps脚本时,它变成如下所示:

示例脚本:

function myFunction() {
// 1. Retrieve values from the active sheet.
const sheet = SpreadsheetApp.getActiveSheet();
const [, ...values] = sheet.getDataRange().getValues();
// 2. Check the value of column "I" and "L" and send the email and return the range list.
const rangeList = values.reduce((ar, [a, b, , , , , g, , i, , , l], r) => {
if (l > 0 && i != "Sent") {
var emailAddress = g + '@gmail.com';
var message = b + " is overdue - Document ID  " + a;
var subject = a + "  is Overdue";
MailApp.sendEmail(emailAddress, subject, message);
ar.push(`i${r + 2}`);
}
return ar;
}, []);
// 3. When the email is sent, the value of "Sent" is put to the column "I".
if (rangeList.length > 0) sheet.getRangeList(rangeList).setValue("Sent");
}

引用:

  • reduce ()
  • getRangeList (a1Notations)

相关内容

  • 没有找到相关文章

最新更新