Как мне выполнить цикл по столбцу, и при достижении определенного значения отправляется электронное письмо на основе значений в той же строке, делая это для заданного диапазона?

#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».
  • Вы хотите снизить стоимость обработки вашего скрипта.

В этом случае, как насчет следующего потока?

  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 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 Спасибо за ответ. Я рад, что ваша проблема была решена.