1

今日一致している場合は、私は、スクリプトを記述しようとしている電子メール今日明日日付単一の電子メールでのためのすべての今後の到着についての情報。しかし、私のスクリプトは、別々の電子メールで各予約の詳細を(条件付き式に一致するかどうか)(今日と明日の条件式の両方について)送信します。メールは単一の電子メールのすべての行の日付が

私はGoole Apps Scriptを使ったスクリプト作成の初心者です。私は "電子メールの配列値のGoogleアプリのスクリプト"と "電子メール内のすべての一致する配列の値"を検索しようとしましたが、それは私が今のところついている新しい光を当てていません。

これの代わりに、今日と今日のどちらの日付にマッチするか(2)すべての予約の詳細を収集し、その後(3)今日の到着と明日の到着でそれらを分割するそれを単一の電子メールメッセージに変換します。ここで

は、私のソースコードです:

/* Отправка уведомлений о предстоящих заездах на сегодня и на завтра. */ 
function NotifyUpcomingArrivals() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 2; // Строка с первым бронированием для начала обработки. 
    var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки. 
    var dataRange = sheet.getRange(startRow, 1, numRows, 18); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 18-ый. 
    var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом. 
    for (var i = 0; i < data.length; ++i) { 
     var row = data[i]; 
     var bookingNumber = [i+2]; 
     var todaysDate = new Date(); // Сегодняшняя дата. 
     var tomorrowsDate = new Date(todaysDate.getTime()+(1*24*3600*1000)); // Завтрашняя дата. 
     var dayAfterTomorrowsDate = new Date(todaysDate.getTime()+(2*24*3600*1000)); // Послезавтрашняя дата. 
     var checkInDate = new Date(row[0]); 
     var checkOutDate = new Date(row[1]); 
     var formattedTodaysDate = Utilities.formatDate(todaysDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedTomorrowsDate = Utilities.formatDate(tomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedDayAfterTomorrowsDate = Utilities.formatDate(dayAfterTomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy"); 
     var fullCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy") + " в 14:00"; 
     var fullCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy") + " в 12:00"; 
     var roomType = "«" + row[2] + "»"; 
     var numberOfGuests = row[3]; 
     var costPerNight = row[4] + " руб."; 
     var prepaymentCost = row[8] + " руб."; 
     var contactFullName = row[5]; 
     var contactPhone = row[6]; 
     var contactEmail = row[7]; 
     var bookingNotes = row[11]; 
     var reviewDummy = row[13]; 
     /* Здесь расчёт промежуточных переменных. */ 
     var differenceBetweenDays = Math.round(Math.abs((checkOutDate.getTime() - checkInDate.getTime())/(24*60*60*1000))); 
     var unpaidCost = (costPerNight*differenceBetweenDays)-prepaymentCost + " руб."; // Сумма, которую необходимо оплатить гостю по приезде. 
     var bookingsListLink = "link"; 
     /* Здесь установка параметров отправителя. */ 
     var recipientEmail = "[email protected]"; 
     var senderName = "Робот Руслана Селецкого (Мини-гостиница Бердянская 56)"; 
     var replyTo = "[email protected]"; 
     var subject = "Сводка бронирований на" + " сегодня (" + formattedTodaysDate + ") и на" + " завтра (" + formattedTomorrowsDate + ")"; 
      /* Сегодняшние заезды. */ 
      if (formattedCheckInDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на сегодня, но кроме тех, которые уже были отменены гостями. 
      var todaysArrivalsMessage = "Бронирования на" + " сегодня (" + formattedTodaysDate + ")" + "\n" + "\n" + contactFullName + " (строка № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nЦена за ночь: " + costPerNight + "\nВнесённый депозит: " + prepaymentCost + "\nОсталось взять по приезде: " + unpaidCost; 
      // MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
      Logger.log("Отправлено уведомление о сегодняшнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
      } 
      /* Завтрашние заезды. */ 
      if (formattedCheckInDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на завтра, но кроме тех, которые уже были отменены гостями. 
      var tomorrowsArrivalsMessage = "\n" + "\nБронирования на" + " завтра (" + formattedTomorrowsDate + ")" + "\n" + "\n" + contactFullName + " (строка № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nЦена за ночь: " + costPerNight + "\nВнесённый депозит: " + prepaymentCost + "\nОсталось взять по приезде: " + unpaidCost + "\n" + "\nПожалуйста, предупреди горничную о предстоящих заездах, а также сделай всё возможное, чтобы всё было готово по приезде гостей." + "\n" + "\n* Посмотреть полный список бронирований всегда можно тут: " + bookingsListLink + "."; 
      // MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
      Logger.log("Отправлено уведомление о завтрашнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
      } 
      var message = todaysArrivalsMessage + tomorrowsArrivalsMessage; 
      MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
      SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу. 
     } 
} 

にはどうすれば所望の結果を達成するためにそれを修正することができますか?参考になるコードの例だけでなく、理解を深めるための参考にしてください。

すべての問題指向のヘルプは、少なくともコミュニティに評価され、評価されています。

/* Отправка уведомлений о предстоящих заездах на сегодня и на завтра (с поправками чувака на Стаковерфлоу.ком). */ 
function NotifyUpcomingArrivals() { 
    var ui = SpreadsheetApp.getUi(); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 2; // Строка с первым бронированием для начала обработки. 
    var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки. 
    var dataRange = sheet.getRange(startRow, 1, numRows, 18); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 18-ый. 
    var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом. 
    /* Здесь установка параметров отправителя. */ 
    var message = undefined; 
    var subject = undefined; 
    var recipientEmail = "[email protected]"; 
    var bookingsListLink = "http://bitly.com/b56bookingslist"; 
    var senderName = "Робот Руслана Селецкого (Мини-гостиница Бердянская 56)"; 
    var replyTo = "[email protected]"; 
    for (var i = 0; i < data.length; ++i) { 
     var row = data[i]; 
     var bookingNumber = [i+2]; 
     var todaysDate = new Date(); // Сегодняшняя дата. 
     var tomorrowsDate = new Date(todaysDate.getTime()+(1*24*3600*1000)); // Завтрашняя дата. 
     var dayAfterTomorrowsDate = new Date(todaysDate.getTime()+(2*24*3600*1000)); // Послезавтрашняя дата. 
     var checkInDate = new Date(row[0]); 
     var checkOutDate = new Date(row[1]); 
     var formattedTodaysDate = Utilities.formatDate(todaysDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedTomorrowsDate = Utilities.formatDate(tomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedDayAfterTomorrowsDate = Utilities.formatDate(dayAfterTomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy"); 
     var formattedCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy"); 
     var fullCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy") + " в 14:00"; 
     var fullCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy") + " в 12:00"; 
     var roomType = "«" + row[2] + "»"; 
     var numberOfGuests = row[3]; 
     var costPerNight = row[4]; 
     var prepaymentCost = row[8]; 
     var formattedCostPerNight = costPerNight + " руб."; 
     var formattedPrepaymentCost = prepaymentCost + " руб."; 
     var contactFullName = row[5]; 
     var contactPhone = row[6]; 
     var contactEmail = row[7]; 
     var bookingNotes = row[11]; 
     var reviewDummy = row[13]; 
     /* Здесь расчёт промежуточных переменных. */ 
     var numberOfNights = Math.round(Math.abs((checkOutDate.getTime() - checkInDate.getTime())/(24*60*60*1000))); 
     var unpaidCost = (costPerNight*numberOfNights)-prepaymentCost; 
     var formattedNumberOfNights = numberOfNights + " шт."; // Количество ночей проживания. 
     var formattedUnpaidCost = unpaidCost + " руб."; // Сумма, которую необходимо оплатить гостю по приезде. 
      /* Сегодняшние заезды. */ 
      if (formattedCheckInDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на сегодня, но кроме тех, которые уже были отменены гостями. 
      var todaysArrivalsMessage = "Бронирования с заездами" + " сегодня (" + formattedTodaysDate + "):" + "\n" + "\n" + contactFullName + " (см. строку № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nКоличество ночей: " + formattedNumberOfNights + "\nЦена за ночь: " + formattedCostPerNight + "\nВнесённый депозит: " + formattedPrepaymentCost + "\nОсталось взять по приезде: " + formattedUnpaidCost; 
      Logger.log("Отправлено уведомление о сегодняшнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
      } 
      /* Завтрашние заезды. */ 
      if (formattedCheckInDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на завтра, но кроме тех, которые уже были отменены гостями. 
      var tomorrowsArrivalsMessage = "Бронирования с заездами" + " завтра (" + formattedTomorrowsDate + "):" + "\n" + "\n" + contactFullName + " (см. строку № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nКоличество ночей: " + formattedNumberOfNights + "\nЦена за ночь: " + formattedCostPerNight + "\nВнесённый депозит: " + formattedPrepaymentCost + "\nОсталось взять по приезде: " + formattedUnpaidCost; 
      Logger.log("Отправлено уведомление о завтрашнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
      } 
      var subject = "Сводка бронирований на" + " сегодня (" + formattedTodaysDate + ") и на" + " завтра (" + formattedTomorrowsDate + ")"; 
      var messageBeginning = "Доброе утро,"; 
      var messageSignature = "Пожалуйста, предупреди горничную о предстоящих заездах, а также сделай всё возможное, чтобы абсолютно всё было готово по приезде гостей." + "\n" + "\n* Посмотреть полный список бронирований всегда можно тут: " + bookingsListLink + "."; 
      var message = messageBeginning + "\n" + "\n" + todaysArrivalsMessage + "\n" + "\n" + tomorrowsArrivalsMessage + "\n" + "\n" + messageSignature; 
      } 
    // MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
    ui.alert("Тестирования механизма формирования уведомлений", "Тема письма:" + "\n" + "\n" + subject + "\n" + "\nТекст письма:" + "\n" + "\n" + message, ui.ButtonSet.OK); 
    Logger.log("Отправлено уведомление с предстоящими заездами" + formattedTodaysDate + " и " + formattedTomorrowsDate + " на " + recipientEmail + "."); 
    SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу. 
} 

今では完璧に動作します:

UPD№1私は@Afroman Makgalemelaの提案に基づか軽微な変更をしました。ありがとう。

+0

あなたのクライアントの電話番号とメールアドレスを含む一般にアクセス可能なスプレッドシートに、ちょっとしたURLが表示されていることがわかります。これがテストデータでない限り、できるだけ早くアクセスを制限することをお勧めします。 –

+0

@samScholefield、ありがとうございます。プライバシーは常に優先事項でした。 – RLearnsR

答えて

1

forループの外側にグローバル変数としてメッセージを宣言し、forループの外側からもsendEmailを呼び出します。 this - > data = dataRange.getValues();グループを日付別に分類すると、今日と明日の結果は別々に送信されます。

/* Отправка уведомлений о предстоящих заездах на сегодня и на завтра. */ 
    function NotifyUpcomingArrivals() { 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     var sheet = SpreadsheetApp.getActiveSheet(); 
     var startRow = 2; // Строка с первым бронированием для начала обработки. 
     var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки. 
    var message = undefined, subject =undefined; 

    var recipientEmail = "[email protected]"; 
var bookingsListLink = "http://bitly.com/b56bookingslist"; 
      var senderName = "Робот Руслана Селецкого (Мини-гостиница Бердянская 56)"; 
      var replyTo = "[email protected]"; 
     var dataRange = sheet.getRange(startRow, 1, numRows, 18); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 18-ый. 
     var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом. 
     for (var i = 0; i < data.length; ++i) { 
      var row = data[i]; 
      var bookingNumber = [i+2]; 
      var todaysDate = new Date(); // Сегодняшняя дата. 
      var tomorrowsDate = new Date(todaysDate.getTime()+(1*24*3600*1000)); // Завтрашняя дата. 
      var dayAfterTomorrowsDate = new Date(todaysDate.getTime()+(2*24*3600*1000)); // Послезавтрашняя дата. 
      var checkInDate = new Date(row[0]); 
      var checkOutDate = new Date(row[1]); 
      var formattedTodaysDate = Utilities.formatDate(todaysDate, "GMT+0300", "dd.MM.yyyy"); 
      var formattedTomorrowsDate = Utilities.formatDate(tomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
      var formattedDayAfterTomorrowsDate = Utilities.formatDate(dayAfterTomorrowsDate, "GMT+0300", "dd.MM.yyyy"); 
      var formattedCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy"); 
      var formattedCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy"); 
      var fullCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy") + " в 14:00"; 
      var fullCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy") + " в 12:00"; 
      var roomType = "«" + row[2] + "»"; 
      var numberOfGuests = row[3]; 
      var costPerNight = row[4] + " руб."; 
      var prepaymentCost = row[8] + " руб."; 
      var contactFullName = row[5]; 
      var contactPhone = row[6]; 
      var contactEmail = row[7]; 
      var bookingNotes = row[11]; 
      var reviewDummy = row[13]; 
      /* Здесь расчёт промежуточных переменных. */ 
      var differenceBetweenDays = Math.round(Math.abs((checkOutDate.getTime() - checkInDate.getTime())/(24*60*60*1000))); 
      var unpaidCost = (costPerNight*differenceBetweenDays)-prepaymentCost + " руб."; // Сумма, которую необходимо оплатить гостю по приезде. 


      subject = "Сводка бронирований на" + " сегодня (" + formattedTodaysDate + ") и на" + " завтра (" + formattedTomorrowsDate + ")"; 
       /* Сегодняшние заезды. */ 
       if (formattedCheckInDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на сегодня, но кроме тех, которые уже были отменены гостями. 
       var todaysArrivalsMessage = "Бронирования на" + " сегодня (" + formattedTodaysDate + ")" + "\n" + "\n" + contactFullName + " (строка № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nЦена за ночь: " + costPerNight + "\nВнесённый депозит: " + prepaymentCost + "\nОсталось взять по приезде: " + unpaidCost; 
       // MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
       Logger.log("Отправлено уведомление о сегодняшнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
       } 
       /* Завтрашние заезды. */ 
       if (formattedCheckInDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на завтра, но кроме тех, которые уже были отменены гостями. 
       var tomorrowsArrivalsMessage = "\n" + "\nБронирования на" + " завтра (" + formattedTomorrowsDate + ")" + "\n" + "\n" + contactFullName + " (строка № " + bookingNumber + ")" + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\nЦена за ночь: " + costPerNight + "\nВнесённый депозит: " + prepaymentCost + "\nОсталось взять по приезде: " + unpaidCost + "\n" + "\nПожалуйста, предупреди горничную о предстоящих заездах, а также сделай всё возможное, чтобы всё было готово по приезде гостей." + "\n" + "\n* Посмотреть полный список бронирований всегда можно тут: " + bookingsListLink + "."; 
       // MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
       Logger.log("Отправлено уведомление о завтрашнем предстоящем заезде по бронированию № " + bookingNumber + " (" + contactFullName + ")" + " на " + recipientEmail + "."); 
       } 
       message += todaysArrivalsMessage + tomorrowsArrivalsMessage; 

      } 
MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo}); 
       SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу. 
    } 
+0

しかし、今日の予約( 'todaysDate = checkInDate')と明日の予約(' tomorrowsDate = checkOutDate')はどのようにして捕捉されますか? – RLearnsR

+0

私はすでに 'var dataRange = sheet.getRange(startRow、1、numRows、18); var data = dataRange.getValues();'を使っています。すべての値を1つの電子メールに入れるために変更する必要があるのは何ですか? – RLearnsR

+0

あなたのコードをリファクタリングします。...明らかに機能をチェックしていません... –

関連する問題