我是新来的编码,特别是使用谷歌脚本。我有一个包含文档和文档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"为
0
或1
- 当值为
1
且列";I"不是Sent
,则希望使用"A", "B"列的值发送电子邮件。和"G"> - 发送邮件时,要将
Sent
的值放到&;i &;列中 - 你想要减少脚本的处理成本。
在这种情况下,下面的流程如何?
- 从活动工作表中检索值
- 检查列"I"的值和";L",发送电子邮件并返回范围列表。
- 当邮件发送时,"已发送"的值;放到"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)