#google-apps-script #google-sheets #gmail
Вопрос:
Я новичок в программировании, в частности, с использованием Google Script. У меня есть электронная таблица с документами и идентификаторами документов, а при просрочке срок выполнения меняется на красный и выполняется как система светофоров.
Однако то, что мне нужно настроить для работы, — это автоматическое электронное письмо, которое будет отправлено, когда значение в столбце L = 1 (на основе красного и других значений в строке равно true), и если значение равно 0, я хочу, чтобы скрипт прошел по нему и переместился вниз по столбцу.
Я пробовал читать и тестировать коды, используя do и while и for и т. Д., Но я просто не могу заставить его работать.
Я уверен, что то, что я настроил, неэффективно и элементарно, но это работает, просто медленно — см. Код ниже.
Когда оно достигает 1, оно затем использует activate cells и смещения, чтобы получить значения из ячеек в соответствующей строке, упаковать электронное письмо и отправить. Затем скрипт перемещается вниз и проверяет следующую ячейку, но поскольку я использую 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);
}
Любые рекомендации будут с благодарностью
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите проверить, равно ли значение столбца «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 amp;amp; 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");
}
Ссылки:
Комментарии:
1. Танайке, это потрясающе, большое тебе спасибо. Это сработало идеально.
2. Я знал, чего хочу, но не был уверен, как это сделать, и использовал, например, reduce . Спасибо за ссылки, будет полезно прочитать об этом, чтобы лучше понять их и использовать в будущем. Еще раз спасибо!
3. @James Спасибо за ответ. Я рад, что ваша проблема была решена.