Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tabloları kullanın

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tabloları kullanın

Google E-Tablolar'dan e-posta göndermek için bir Google Apps Komut Dosyası kullanılması gerekir. Ancak endişelenmeyin, daha önce tek bir Google Apps komut dosyası oluşturmadıysanız, e-posta göndermek çok basittir.

Aşağıdaki eğiticide, Google E-Tablolar'da bir hücrenin değerini nasıl kontrol edeceğinizi öğreneceksiniz . Değer belirli bir eşik sınırının üzerindeyse, istediğiniz herhangi bir e-posta adresine otomatik olarak bir uyarı e-postası gönderebilirsiniz.

Bu betiğin birçok kullanım alanı vardır. Satış raporunuzdaki günlük kazançlar belirli bir seviyenin altına düşerse bir uyarı alabilirsiniz. Veya çalışanlarınız proje izleme e-tablonuzda müşteriyi çok uzun süre faturalandırdıklarını bildirirse bir e-posta alabilirsiniz.

Uygulama ne olursa olsun, bu komut dosyası zorlayıcıdır. Ayrıca, e-tablo güncellemelerinizi manuel olarak izlemek zorunda kalmanıza zaman kazandırır.

1. Adım: Google E-Tablolar ile E-posta Gönderme

Google E-Tablolar'dan bir e-posta göndermek üzere bir Google Apps Komut Dosyası oluşturabilmeniz için ayrıca, Google Apps Komut Dosyasının uyarı e-postalarınızı göndermek için erişeceği bir Gmail e-posta adresine de ihtiyacınız olacaktır.

Ayrıca, bir e-posta adresi içeren yeni bir elektronik tablo oluşturmanız gerekecektir.

Sadece bir ad sütunu ve bir e-posta sütunu ekleyin ve bunları uyarı e-postasını almak istediğiniz kişiyle doldurun.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Artık uyarı e-postası göndereceğiniz bir e-posta adresiniz olduğuna göre, komut dosyanızı oluşturma zamanı.

Komut dosyası düzenleyicisine girmek için Araçlar 'ı ve ardından Komut Dosyası düzenleyici 'yi tıklayın .

myFunction() adlı varsayılan işleve sahip bir komut dosyası penceresi göreceksiniz  . Bunu SendEmail() olarak yeniden adlandırın .

Ardından, SendEmail() işlevinin içine aşağıdaki kodu yapıştırın:

// Fetch the email address var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("B2"); var emailAddress = emailRange.getValues(); // Send Alert Email. var message = 'This is your Alert email!'; // Second column var subject = 'Your Google Spreadsheet Alert'; MailApp.sendEmail(emailAddress, subject, message);

İşte bu kod nasıl çalışır:

  • getRange ve getValues , değeri getRange yönteminde belirtilen hücreden çeker.
  • var mesajı ve var konu uyarı e-postanızı oluşturacak metni tanımlar.
  • MailApp.sendEmail işlevi sonunda, bağlı Google hesabınızı kullanarak Google Komut Dosyalarının e-posta gönderme özelliğini gerçekleştirir .

Komut dosyasını disk simgesine tıklayarak kaydedin ve ardından çalıştır simgesine (sağ ok) tıklayarak çalıştırın.

Google Script'in e-postayı göndermek üzere Gmail hesabınıza erişmek için izne ihtiyacı olduğunu unutmayın . Yani betiği ilk çalıştırdığınızda, aşağıdaki gibi bir uyarı görebilirsiniz.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

İzinleri Gözden Geçir'e tıklayın ve atlamanız gereken başka bir uyarı ekranı göreceksiniz.

Bu uyarı ekranı, resmi olarak kayıtlı olmayan özel bir Google Komut Dosyası yazıyor olmanızdır.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Gelişmiş seçeneğine tıklayın ve ardından SendEmail'e Git (güvenli olmayan) bağlantısını tıklayın.

Bunu yalnızca bir kez yapmanız gerekecek. Komut dosyanız çalışacak ve e-tablonuzda belirttiğiniz e-posta adresine aşağıdaki gibi bir e-posta gönderilecektir.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

2. Adım: Google E-Tablolarda Bir Hücreden Değer Okuma

Bir uyarı e-postası gönderebilen bir Google Apps Komut Dosyası'nı başarıyla yazdığınıza göre, artık bu uyarı e-postasını daha işlevsel hale getirmenin zamanı geldi.

Öğreneceğiniz bir sonraki adım, bir Google E-Tablosundan bir veri değerini nasıl okuyacağınızı, değeri kontrol etmeyi ve bu değer bir üst sınırın üstünde veya altındaysa bir açılır mesaj yayınlamayı öğrenecektir.

Bunu yapmadan önce, birlikte çalıştığınız Google E-Tablosunda başka bir sayfa oluşturmanız gerekir. Bu yeni sayfaya “Raporum” adını verin.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Kontrol etmek ve karşılaştırmak isteyeceğiniz hücrenin D2 olduğunu unutmayın. Her ay toplam satışlarınızın 16.000$'ın altına düşüp düşmediğini öğrenmek istediğinizi hayal edin.

Bunu yapan Google Apps Komut Dosyasını oluşturalım.

Araçlar'a ve ardından Komut Dosyası Düzenleyici'ye tıklayarak Komut Dosyası Düzenleyici pencerenize geri dönün .

Aynı elektronik tabloyu kullanıyorsanız, orada SendEmail() işlevine sahip olacaksınız  . Bu kodu kesin ve Not Defteri'ne yapıştırın. Daha sonra ihtiyacın olacak.

Aşağıdaki işlevi kod penceresine yapıştırın.

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); var ui = SpreadsheetApp.getUi(); // Check totals sales if (monthSales < 16000){="" ui.alert('sales="" too="" low!');="" }="">

Bu kod nasıl çalışır:

  • D2 hücresindeki değeri aySales değişkenine yükleyin.
  • EĞER ifadesi, D2 hücresindeki aylık satışları 16.000 ABD Doları ile karşılaştırır
  • Değer 16.000'in üzerindeyse kod, uyarı içeren bir tarayıcı mesaj kutusunu tetikler.

Bu kodu kaydedin ve çalıştırın. Düzgün çalışıyorsa, tarayıcınızda aşağıdaki uyarı mesajını görmelisiniz.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Artık bir e-posta uyarısı gönderebilen bir Google Apps Komut Dosyasına ve bir elektronik tablodaki değeri karşılaştırabilen başka bir komut dosyasına sahip olduğunuza göre, bir uyarı iletisini tetiklemek yerine ikisini birleştirmeye ve bir uyarı göndermeye hazırsınız.

Adım 3: Hepsini Bir Araya Getirmek

Şimdi oluşturduğunuz iki komut dosyasını tek bir komut dosyasında birleştirmenin zamanı geldi.

Bu noktada, uyarı e-posta alıcısını içeren Sayfa1 adlı bir sekmeye sahip bir elektronik tablonuz olmalıdır. MyReport adlı diğer sekme, tüm satış bilgilerinizi içerir.

Komut Dosyası Düzenleyicisine geri döndüğünüzde, şimdiye kadar öğrendiğiniz her şeyi uygulamaya koymanın zamanı geldi.

Komut dosyası düzenleyicisindeki tüm kodu, burada gösterildiği gibi düzenlenen iki işlevinizle değiştirin.

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); // Check totals sales if (monthSales < 16000){="" fetch="" the="" email="" address="" var="" emailrange="SpreadsheetApp.getActiveSpreadsheet().getSheetByName(" sheet1").getrange("b2");"="" var="" emailaddress="emailRange.getValues();" send="" alert="" email.="" var="" message='This month your sales were ' +="" monthsales;="" second="" column="" var="" subject='Low Sales Alert' ;="" mailapp.sendemail(emailaddress,="" subject,="" message);="" }="">

Buradaki düzenlemelere dikkat edin.

IF ifadesinin içine, SendEmail komut dosyasını , if ifadesi parantezlerinin içindeki CheckSales() işlevinin içine yapıştırın.

İkinci olarak, + karakterini kullanarak e-posta mesajının sonuna aySales değişkenini birleştirin.

Yapılacak tek şey CheckSales() işlevini her ay tetiklemek.

Bunu yapmak için komut dosyası düzenleyicisinde:

  1. Düzenle menü öğesine tıklayın ve ardından Mevcut projenin tetikleyicilerine tıklayın .
  2. Ekranın alt kısmında, yeni bir tetikleyici oluştur üzerine tıklayın .
  3. Çalıştırmak için CheckSales işlevini seçin .
  4. Olay kaynağını seç'i zamana dayalı olarak değiştirin .
  5. Select type of time-based trigger'ı Aylık zamanlayıcı olarak değiştirin  .

Tetikleyiciyi sonlandırmak için Kaydet'e tıklayın .

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Her ay, yeni komut dosyanız çalışır ve D2 hücresindeki toplam aylık satış tutarını 16.000 ABD Doları ile karşılaştırır.

Daha azsa, size düşük aylık satışları bildiren bir uyarı e-postası gönderir.

Hücre Değerine Dayalı Bir E-posta Göndermek için Google E-Tablolar'ı kullanın

Gördüğünüz gibi, Google Apps Komut Dosyaları, küçük bir pakette çok sayıda işlevsellik barındırıyor. Sadece birkaç basit kod satırı ile oldukça şaşırtıcı şeyler yapabilirsiniz.

Biraz daha denemek isterseniz, 16.000 dolarlık karşılaştırma sınırını e-tablodaki başka bir hücreye eklemeyi deneyin ve ardından karşılaştırmayı yapmadan önce bunu komut dosyanızda okuyun. Bu şekilde, sadece sayfadaki değeri değiştirerek limiti değiştirebilirsiniz.

Kodu ince ayar yaparak ve yeni kod blokları ekleyerek, sonunda harika Google Komut Dosyaları oluşturmak için öğrendiğiniz bu basit şeyleri geliştirebilirsiniz.

Süreci otomatikleştirme

Şu ana kadar her şey yolunda, ancak yukarıdaki komut dosyası yalnızca herhangi bir tetikleyici ayarlamadığımız takdirde manuel olarak çalışacaktır. Neyse ki Google, tetiklenen otomasyonun yapılandırılmasını kolaylaştırdı. İşte adımlar. 

Apps Komut Dosyası düzenleyicisinde, sol kenar çubuğundaki Tetikleyiciler simgesini tıklayın (küçük bir saate benzer).

 Yeni tetikleyici oluşturr bağlantısını veya Tetikleyici Ekle

 Hangi işlevin çalıştırılacağını seçin açılır menüsünde, sendEmails<'i seçin bir i=4> işlevi.

 Etkinlik kaynağını seç açılır menüsünde Zamana dayalı

 Zamana dayalı tetikleyici türünü seçin açılır menüsünde istediğiniz sıklığı seçin (ör., Günlük e-postalar için gün zamanlayıcı , Haftalık e-postalar için hafta zamanlayıcı vb.).

Varsa istediğiniz zaman aralığını veya haftanın gününü seçin.

Tetikleyiciyi oluşturmak için Kaydet 'yi tıklayın.

Kaydettikten sonra sağ üst köşedeki Dağıt düğmesini tıklayın ve dağıtımı etiketlemek ve tanımlamak için talimatları izleyin. Çalıştırmak için otomasyon izinlerini vermeniz gerekecek ve aynı şey betiğin kendisi için de geçerli.  

Verilen tetikleyiciye gelince, örneğimiz fatura hatırlatıcılarının gönderilmesiyle ilgili olduğundan, bunların aylık olduğunu varsayıyoruz ve bunların her ayın 1'inde saat 13:00 ile 14:00 arasında gönderilmesinin uygun olduğunu varsayıyoruz. Ancak elbette ihtiyaçlarınıza göre sıklığını ve zamanlamasını değiştirebilirsiniz. 

Ek içeren bir e-posta nasıl gönderilir?

Ekli e-postaların nasıl gönderileceğini size göstermek için, fatura hatırlatıcıları içeren örnek sayfayı yeniden kullanacağız ve ekleri içerecek şekilde pasajı yeniden düzenleyeceğiz. Şimdi işlevle başlıyoruz ve e-posta şablonu kodun ilerleyen kısımlarında geliyor. gönderE-postaHatırlatmalar

Aşağıdaki snippet'in, e-posta eklerini bir Google Drive klasöründen aldığını, burada klasör kimliğini eklemenin ve verilen adlandırma kuralına uymanın kritik önem taşıdığını vurgulamalıyız. Bu konuyla ilgili daha fazla bilgiyi Kod bölümünü parçalara ayıralım bölümünde bulabilirsiniz. 

function sendEmailReminders() { // Etkin sayfayı alın var sayfa = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Veri aralığını alın (başlık satırı hariç) var dataRange = Sheet.getRange(2, 1, Sheet.getLastRow() - 1, Sheet.getLastColumn()); // Veri aralığındaki değerleri alın var data = dataRange.getValues(); // Veri satırları arasında döngü yapın for (var i = 0; i < veri.uzunluk; i++) { var satır = veri[i]; // Her sütundaki değerleri alın var işletmeAdı = satır[0]; var e-posta = satır[1]; var faturaNumber = satır[2]; var fatura Tutarı = satır[3]; var DueDate = satır[4]; var konu = satır[5]; // E-posta gövdesi var emailBody = "Sevgili " + işletmeAdı + ",\n\n" + "Bu, Fatura #" + faturaNumarası + " $" için; + fatura Tutarı + " " + vadeTarihi + ".\n" + "Lütfen ekteki faturayı bulun.\n\n" + "Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz."; // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } // MailApp.sendEmail({ to: email, Subject: Subject, Body: EmailBody,attacks: [invoiceFile] }); ekini içeren e-postayı gönderin. } }

Kodu parçalayalım

1. İşlevi tanımlayın:sendEmailReminders

function sendEmailReminders() {

Satır, eklerle birlikte e-posta hatırlatıcıları gönderme kodunu içerecek olan adlı bir işlevi bildirir.sendEmailReminders

2. Aktif sayfayı alın:

var sayfa = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

Satır, etkin sayfayı şu anda açık olan Google E-Tablolar belgesinden alır.

3. Veri aralığını alın (başlık satırı hariç):

var dataRange = sayfa.getRange(2, 1, sayfa.getLastRow() - 1, sayfa.getLastColumn());

Bu satır, başlık satırı hariç, sayfadaki veri aralığını alır. İkinci satırdan (satır 2) ve ilk sütundan (sütun 1) başlar ve sayfanın son satırına ve son sütununa kadar uzanır.

Yan Not: Özel sayfanızı oluşturduğunuzda, sayfayı sayfanızla eşleşecek şekilde değiştirmeniz gerekir. veri Aralığı

4. Veri aralığındaki değerleri alın:

var veri = dataRange.getValues();

Bu satır, önceki adımda tanımlanan hücre aralığından değerleri (içerik) alır.

5. Veri satırları arasında dolaşın:

for (var i = 0; i < veri.uzunluk; i++) { var satır = veri[i];

Bu döngü, dizideki her satırda yinelenir. Değişken, her yinelemedeki geçerli veri satırını temsil eder.fordatarow

6. Her sütundaki değerleri alın:

var işAdı = satır[0]; var e-posta = satır[1]; var faturaNumber = satır[2]; var fatura Tutarı = satır[3]; var DueDate = satır[4]; var konu = satır[5];

Yukarıdaki satırlar, geçerli veri satırındaki her sütundaki değerleri çıkarır. Her değer daha sonra kodda kolay başvurulabilmesi için bir değişkene atanır. Verilen değerler örnek sayfamıza özeldir. 

7. E-posta gövdesini oluşturun:

var emailBody = "Sevgili " + işletmeAdı + ",\n\n" + "Bu, Fatura #" + faturaNumarası + " $" için; + fatura Tutarı + " " + vadeTarihi + ".\n" + "Lütfen ekteki faturayı bulun.\n\n" + "Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz.";

Kod, e-posta gövdesini sayfadan çıkarılan değerleri kullanarak oluşturur. E-posta gövdesi, işletme adını, fatura numarasını, fatura tutarını ve vade tarihini içeren bir dizedir.

8. İlgili fatura dosyasını alın:

var faturaFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumarası); devam etmek; }

Bu satırlar, geçerli satırla ilişkili fatura dosyasını alır. 

Öncelikle fatura dosyası klasörüne klasör kimliği kullanılarak erişilir. Gerçek klasör kimliğiyle değiştirdiğinizden emin olun. YOUR_FOLDER_ID_HERE

Örneğimizdeki adlandırma kuralının şöyle olduğunu ve gerçek faturanın adının "123456.pdf" olduğunu unutmayın. Ek dosyalarınız farklı şekilde adlandırılmışsa biçimlendirmeyi güncellemeniz gerekir. (faturaNumarası + '.pdf')

Daha sonra komut dosyası, fatura numarasıyla aynı adı taşıyan bir dosyayı arar (dosyanın PDF formatında olduğu varsayılarak). 

Dosya bulunursa değişkene atanır; aksi takdirde, komut dosyası bir hata iletisini günlüğe kaydeder ve sonraki satıra geçer.invoiceFile

9. E-postayı ekiyle birlikte gönderin:

MailApp.sendEmail({ to: e-posta, konu: konu, gövde: emailBody, ekler: [invoiceFile] });

Bu satır, metni ve e-posta eklerini gönderir ve almanız gereken sonuçlar şunlardır. Ayrıca, tüm otomasyon adımları daha önce açıklandığı gibi uygulanır ve bu, fatura hatırlatıcılarının gönderilmesiyle ilgili olduğundan aylık tetikleyiciyi tutmak mantıklıdır. 

GSheets ile HTML e-postası gönderin

Bir HTML e-postası göndermek için, daha önce açıklanan komut dosyasında oldukça basit bazı değişiklikler yapabilirsiniz. İşte burada: 

function sendEmailReminders() { // Etkin sayfayı alın var sayfa = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Veri aralığını alın (başlık satırı hariç) var dataRange = Sheet.getRange(2, 1, Sheet.getLastRow() - 1, Sheet.getLastColumn()); // Veri aralığındaki değerleri alın var data = dataRange.getValues(); // Veri satırları arasında döngü yapın for (var i = 0; i < veri.uzunluk; i++) { var satır = veri[i]; // Her sütundaki değerleri alın var işletmeAdı = satır[0]; var e-posta = satır[1]; var faturaNumber = satır[2]; var fatura Tutarı = satır[3]; var DueDate = satır[4]; var konu = satır[5]; // HTML e-posta gövdesi var emailBodyHtml = "<p>Sevgili " + işletmeAdı + ",</p>" + "<p>Bu, Fatura #" + faturaNumarası + " $" için; + fatura Tutarı + " " + vadeTarihi + ".</p>"; + "<p>Lütfen ekteki faturayı bulun.</p>" + "<p>Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz.</p>"; // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } // E-postayı ek olarak MailApp.sendEmail({ to: email, Subject: Subject, htmlBody: emailBodyHtml,attacks: [invoiceFile] }); } }

Bu sürümde, düz metin, HTML biçimli içerik içeren bir değişkenle değiştirilmiştir. e-postaGövdee-postaGövdeHtml

İşlev çağrılırken, body özelliği de e-postayı HTML email olarak gönderecek olan özellik ile değiştirilir.MailApp.sendEmail()htmlBody

Yan Notlar: 

Kolaylık olması açısından komut dosyasında bunun yerine kullanıyoruz. Her iki seçenek de işe yarayacaktır, ancak kesinlikle daha okunaklıdır. Her neyse, komut dosyasını yeniden biçimlendirmekten ve birleştirme operatörünü dize enterpolasyonunda yer tutucularla değiştirmekten çekinmeyin. varconstconst${ifade}

Ayrıca, örneklerimiz için gerekli olmadığından komut dosyalarının hiçbiri işlevler içermiyor. Ancak elbette bu tür komut dosyalarını eklemek ve hatta bunları otomatikleştirmek de mümkündür. bccbcc

Son olarak, özel CSS stilleri ekleyerek işleri biraz daha renklendirebilirsiniz. Aşağıdaki güncellenen işleve bakın. var emailBodyHtml =

// CSS stillerine sahip HTML e-posta gövdesi var emailBodyHtml = "<html><head><style>" + "gövde {yazı tipi ailesi: Arial, sans-serif;}"; + "p {yazı tipi boyutu: 14px;}" + ".invoice-info {font-weight: kalın; renk: #4a4a4a;}" + "</style></head><body>" + "<p>Sayın <span class='fatura bilgisi'>" + işletmeAdı + "</span>,</p>" + "<p>Bu, Fatura #<span class='invoice-info'>" olduğunu hatırlatmak için kullanılır. + faturaNumarası + "</span> for $<span class='invoice-info'>" + fatura Tutarı + "</span> <span class='invoice-info'>" tarihinde sona erecektir. + DueDate + "</span>.</p>" + "<p>Lütfen ekteki faturayı bulun.</p>" + "<p>Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz.</p>" + "</body></html>";

Profesyonel İpuçları: 

  • Bazı posta kutusu sağlayıcıları yoğun biçimde stilize edilmiş e-postaları düzgün bir şekilde desteklemeyebilir ve oluşturmayabilir veya hiç sunmayabilir. <stil>
  • Posta kutusu sağlayıcılarının HTML e-postalarınızı ne kadar desteklediğini görmek için Mailtrap E-posta Testini kullanın. 
  • Tekrar vurgulamak gerekirse, Bir hacimde göndermeniz gerekiyorsa, işlev yerine uygun bir MTA  kullanmak her zaman en iyisidir. e-posta gönder
  • Bu notta Gmail hesabınızın sınırlamalarına dikkat edin. Bunlar Google Workspace ve/veya özel hesabınız için farklıdır. 

Google E-Tablolardan tetikleyici e-postalar nasıl gönderilir?

Bir hücre belirli bir değere ulaştığında

Hücre değerine göre nasıl otomatik e-posta göndereceğinizi göstereceğiz. Örneğimizde Fatura Tutarı hücresi, müşteriyi kaybettiğini gösteren '0'a ulaştığında fatura gönderilecektir. 

Verilen hücre değeri, müşteriye anında ulaşmak için özel bir iptal e-postasını tetikler. Otomasyon adımları yine aynı kalır; bu e-postalar için aylık tetikleyiciyi kullanmaya devam edebilirsiniz. 

Komut dosyasının, HTML e-postaları ve eklerini göndermek için kullandığımız komut dosyasıyla aynı olduğunu unutmayın. Ancak açıklanan koşullu mantığı tanıtmak için başka bir işlevsellik katmanına sahiptir. İşte kod. 

function sendEmailReminders() { // Etkin sayfayı alın var sayfa = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Veri aralığını alın (başlık satırı hariç) var dataRange = Sheet.getRange(2, 1, Sheet.getLastRow() - 1, Sheet.getLastColumn()); // Veri aralığındaki değerleri alın var data = dataRange.getValues(); // Veri satırları arasında döngü yapın for (var i = 0; i < veri.uzunluk; i++) { var satır = veri[i]; // Her sütundaki değerleri alın var işletmeAdı = satır[0]; var e-posta = satır[1]; var faturaNumber = satır[2]; var fatura Tutarı = satır[3]; var DueDate = satır[4]; var konu = satır[5]; // Fatura tutarına göre e-posta gövdesini belirleyin var emailBodyHtml; if (invoiceAmount == 0) { // Müşteriyi kullanmayı bırakan e-posta konusu = "Müşteriyi kaybetme bildirimi"; emailBodyHtml = "<html><head><style>" + "gövde {yazı tipi ailesi: Arial, sans-serif;}"; + "p {yazı tipi boyutu: 14px;}" + ".invoice-info {font-weight: kalın; renk: #4a4a4a;}" + "</style></head><body>" + "<p>Sevgili" + işletmeAdı + ",</p>" + "<p>Fatura tutarınızın 0 ABD doları olduğunu fark ettik. Gittiğiniz için üzgünüz ve hizmetlerimizi kullanmayı neden bırakmaya karar verdiğinize ilişkin geri bildirimlerinizi memnuniyetle karşılarız.</p>" + "<p>Hizmetlerimizi geliştirmek veya işletmenizi geri kazanmak için yapabileceğimiz bir şey varsa lütfen bize bildirin.</p>" + "<p>Geçmişteki işleriniz için teşekkür ederiz.</p>" + "</body></html>"; } else { // Normal fatura e-postası emailBodyHtml = "<html><head><style>" + "gövde {yazı tipi ailesi: Arial, sans-serif;}"; + "p {yazı tipi boyutu: 14px;}" + ".invoice-info {font-weight: kalın; renk: #4a4a4a;}" + "</style></head><body>" + "<p>Sayın <span class='fatura bilgisi'>" + işletmeAdı + "</span>,</p>" + "<p>Bu, Fatura #<span class='invoice-info'>" olduğunu hatırlatmak için kullanılır. + faturaNumarası + "</span> for $<span class='invoice-info'>" + fatura Tutarı + "</span> <span class='invoice-info'>" tarihinde sona erecektir. + DueDate + "</span>.</p>" + "<p>Lütfen ekteki faturayı bulun.</p>" + "<p>Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz.</p>" + "</body></html>"; } // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaDosyaları.Sonraki(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } // E-postayı ek olarak MailApp.sendEmail({ to: email, Subject: Subject, htmlBody: emailBodyHtml,attacks: [invoiceFile] }); } }

Kod kırmaya kadar 

Daha önce açıklananların tekrarlanmasını önlemek için yalnızca işlevde bulunanlara odaklandığımızı unutmayın. emailBodyHtml

Kodun güncellenen kısmı, fatura tutarına göre e-posta gövdesinin içeriğini belirler. Fatura tutarı şu şekildeyse, bu müşterinin aboneliği kaybeden müşteri olduğu varsayılır ve farklı bir e-posta şablonu kullanılır. İşte kodun bir dökümü: '0'

var emailBodyHtml;

Adlı bir değişken bildirir ve e-posta gövdesinin içeriğini saklar. Ve başlangıçta unDefinition.emailBodyHtml olarak bırakıldı

if (fatura Tutarı == 0) { ... }

İfade, fatura tutarının 0 olup olmadığını kontrol eder. Eğer öyleyse süslü parantezlerin içindeki kod yürütülür. Bu blok, kayıp müşteri e-posta şablonunu içerir.if(`{}`)

konu = "Müşteriyi kaybetme bildirimi";

Bu satır, uygulamayı kullanmayı bırakan müşteriler için konu olan e-postayı belirler."Churn müşteri bildirimi"

emailBodyHtml = "<html><head><style>" +...

 Satır, değişkenin değerini kayıp müşteri e-posta şablonuna ayarlar. Şablon, bölümde tanımlanan CSS stillerine sahip bir HTML dizesidir. E-posta gövdesinde işletme adı için yer tutucular ve müşteriye gönderilen bir mesaj bulunur.emailBodyHtml<head>

} başka { ... }

Blok, fatura tutarı 0 olmadığında yürütülür. Değişkeni normal fatura e-posta şablonuna ayarlar. E-posta şablonu, bölümde tanımlanan CSS stillerine sahip bir HTML dizesidir. E-posta gövdesi işletme adı, fatura numarası, fatura tutarı ve vade tarihi için yer tutucular içerir.elseemailBodyHtml<head>

Komut dosyası, bu koşullu mantığı kullanarak, fatura tutarının (kayıp müşteri) veya sıfırdan farklı (normal fatura) olmasına bağlı olarak farklı bir e-posta gövdesi gönderir. 0

Hücre değeri değiştiğinde

Şimdi, yukarıda kullanılan aynı komut dosyasını alıp başka bir kullanım durumunu kapsayacak şekilde genişleteceğiz - bir müşteri yükseltmeleri ve hesap yöneticisinin faturayla birlikte bir "Teşekkür Ederiz" e-postası göndermesi gerekiyor. 

Açıklamak gerekirse, buradaki fikir, hesap yöneticisinin her ay müşterilerin kimlik bilgilerini içeren yeni bir Sayfaya (örneğimizde Sayfa 2) sahip olmasıdır. 

Kod artık iki sayfayı karşılaştıracak ve yükseltme yapan müşterilere normal fatura e-postası yerine otomatik bir "Teşekkür ederiz" e-postası gönderecek (onların Fatura Tutarı öncekiyle karşılaştırıldığında daha büyüktür). 

Ayrıca, birinin hayali hizmetimizi kullanmayı bırakmaya karar verme ihtimali olduğundan, uygulamayı kullanmayı bırakan e-postaya dokunmanıza gerek yoktur. İşte senaryo.

function sendEmailReminders() { var sayfa1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sayfa1"); var sayfa2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sayfa2"); var dataRange1 = sayfa1.getRange(2, 1, sayfa1.getLastRow() - 1, sayfa1.getLastColumn()); var dataRange2 = sayfa2.getRange(2, 1, sayfa2.getLastRow() - 1, sayfa2.getLastColumn()); var veri1 = dataRange1.getValues(); var veri2 = dataRange2.getValues(); for (var i = 0; i < veri1.uzunluk; i++) { var satır1 = veri1[i]; var satır2 = veri2[i]; var işAdı = satır1[0]; var e-posta = satır1[1]; var faturaNumber = satır1[2]; var faturaAmount1 = parseFloat(row1[3].toString().replace('$', '').replace(',', ' 39;.')); var faturaAmount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', ' 39;.')); if (isNaN(invoiceAmount1) || isNaN(invoiceAmount2)) { console.error("İşletme için geçersiz fatura tutarları: " + businessName + ". faturaTutarı1: " + faturaTutarı1 + ", faturaTutarı2: " + faturaTutarı2 ); devam etmek; } var son tarih = satır1[4]; var konu; var emailBodyHtml; if (invoiceAmount1 < faturaAmount2) { console.log("Yükselttiğiniz için Teşekkür Ederiz' e-postası " + email + " adresine gönderiliyor. faturaTutarı1: " + faturaTutarı1 + ", faturaAmount2: " + fatura Tutarı2); konu = "Yükselttiğiniz için Teşekkür ederiz"; emailBodyHtml = "<html><body>" + "<p>Sevgili" + işletmeAdı + ",</p>" + "<p>Yeni sürüme geçirdiğiniz için teşekkür ederiz! Yaptığınız işi takdir ediyoruz ve size hizmet vermeyi sabırsızlıkla bekliyoruz.</p>" + "<p>Saygılarımla,</p>"; + "<p>Şirketiniz</p>" + "</body></html>"; MailApp.sendEmail({ to: email, Subject: Subject, htmlBody: emailBodyHtml }); } else if (invoiceAmount1 == 0) { console.log("Churn müşteri bildirimi' e-postası " + email + " adresine gönderiliyor. faturaAmount1: " + faturaAmount1); konu = "Müşteriyi kaybetme bildirimi"; emailBodyHtml = "<html><head><style>" + "gövde {yazı tipi ailesi: Arial, sans-serif;}"; + "p {yazı tipi boyutu: 14px;}" + ".invoice-info {font-weight: kalın; renk: #4a4a4a;}" + "</style></head><body>" + "<p>Sevgili" + işletmeAdı + ",</p>" + "<p>Fatura tutarınızın 0 ABD doları olduğunu fark ettik. Gittiğiniz için üzgünüz ve hizmetlerimizi kullanmayı neden bırakmaya karar verdiğinize ilişkin geri bildirimlerinizi memnuniyetle karşılarız.</p>" + "<p>Hizmetlerimizi geliştirmek veya işletmenizi geri kazanmak için yapabileceğimiz bir şey varsa lütfen bize bildirin.</p>" + "<p>Geçmişteki işleriniz için teşekkür ederiz.</p>" + "</body></html>"; MailApp.sendEmail({ to: e-posta, konu: konu, htmlBody:emailBodyHtml }); } else { console.log("'Fatura Hatırlatıcısı' e-postası " + e-posta + " adresine gönderiliyor. billAmount1: " + faturaTutarı1 + ", faturaAmount2: " + faturaAmount2); konu = "Fatura Hatırlatma"; emailBodyHtml = "<html><head><style>" + "gövde {yazı tipi ailesi: Arial, sans-serif;}"; + "p {yazı tipi boyutu: 14px;}" + ".invoice-info {font-weight: kalın; renk: #4a4a4a;}" + "</style></head><body>" "<p>Sayın <span class='fatura bilgisi'>" + işletmeAdı + "</span>,</p>" + "<p>Bu, Fatura #<span class='invoice-info'>" olduğunu hatırlatmak için kullanılır. + faturaNumarası + "</span> for $<span class='invoice-info'>" + faturaTutarı1 + "</span> <span class='invoice-info'>" tarihinde sona erecektir. + DueDate + "</span>.</p>" + "<p>Lütfen ekteki faturayı bulun.</p>" + "<p>Bu konuyla hemen ilgilendiğiniz için teşekkür ederiz.</p>" + "</body></html>"; // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } MailApp.sendEmail({ to: e-posta, konu: konu, htmlBody: emailBodyHtml, ekler: [invoiceFile] }); } } }</p>" + "</body></html>"; // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } MailApp.sendEmail({ to: e-posta, konu: konu, htmlBody: emailBodyHtml, ekler: [invoiceFile] }); } } }</p>" + "</body></html>"; // İlgili faturayı ekleyin - Faturalarınızın saklandığı doğru klasör kimliğini sağlamanız gerekir var billFolderId = 'YOUR_FOLDER_ID_HERE'; var faturaFolder = DriveApp.getFolderById(invoiceFolderId); var faturaFiles = faturaFolder.getFilesByName(invoiceNumber + '.pdf'); // Fatura dosyalarının PDF formatında olduğu varsayılarak var faturaDosyası; if (invoiceFiles.hasNext()) { faturaDosyası = faturaFiles.next(); } else { // Fatura dosyası bulunamazsa, bu satırı atlayabilir veya bir hata kaydedebilirsiniz console.error("Fatura numarası için fatura dosyası bulunamadı: " + faturaNumber); devam etmek; } MailApp.sendEmail({ to: e-posta, konu: konu, htmlBody: emailBodyHtml, ekler: [invoiceFile] }); } } }

Kod kırmaya kadar 

1. Betik, hem Sayfa1 hem de Sayfa2'ye referanslar alarak başlar.

var sayfa1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sayfa1"); var sayfa2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sayfa2");

2. Daha sonra, başlıkları hariç tutmak için ikinci satırdan başlayarak her iki sayfadaki verileri alır.

var dataRange1 = sayfa1.getRange(2, 1, sayfa1.getLastRow() - 1, sayfa1.getLastColumn()); var dataRange2 = sayfa2.getRange(2, 1, sayfa2.getLastRow() - 1, sayfa2.getLastColumn()); var veri1 = dataRange1.getValues(); var veri2 = dataRange2.getValues();

3. Komut dosyası her iki sayfadaki satırlar üzerinde yinelenir (satır sayısının her iki sayfada da aynı olduğu varsayılarak). Karşılık gelen her satır için Sayfa1 ve Sayfa2'deki fatura tutarlarını karşılaştırır.

for (var i = 0; i < veri1.uzunluk; i++) { var satır1 = veri1[i]; var satır2 = veri2[i]; // Her iki sayfadan da fatura tutarlarını alın var billAmount1 = parseFloat(row1[3].toString().replace('$', '').replace(' ,', '.')); var faturaAmount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', ' 39;.'));

Kopyala

4. Komut dosyası daha sonra Sayfa1 ve Sayfa2'deki fatura tutarlarının karşılaştırılmasına dayalı olarak farklı türde e-postaların gönderilmesine ilişkin koşulları kontrol eder.

if (faturaTutarı1 < faturaTutarı2) { // "Yükselttiğiniz için Teşekkür ederiz" gönder; email } else if (invoiceAmount1 == 0) { // "Churn müşteri bildirimi" gönder e-posta } else { // "Fatura Hatırlatma" gönder e-posta }

Kopyala

Temel karşılaştırma, Sayfa1'deki fatura tutarının aynı satıra (yani aynı müşteriye) ilişkin Sayfa2'deki fatura tutarından az olup olmadığını kontrol eden karşılaştırmadır. Doğruysa komut dosyası, müşterinin yükseltme yaptığını varsayar ve bir e-posta gönderir. Aksi takdirde, diğer koşulları (karışıklık veya normal fatura hatırlatmaları) kontrol eder ve uygun e-postayı gönderir.if (invoiceAmount1 < faturaAmount2)"Yükselttiğiniz için Teşekkür ederiz"

Bir Google E-Tablolar dosyası güncellendiğinde

Şimdi, hesap yöneticisi dışındaki kişilerin e-tabloya erişebildiği farklı bir kullanım durumunu tartışmak faydalı olacaktır. 

Hesap yöneticimizin müşterilerle tanışmaya ve sorularını yanıtlamaya ayrılmış bir günü olduğunu varsayalım. Müşteriler, sorunu kısaca tanımlayabilecekleri ve yer ayırtabilecekleri bir elektronik tabloya erişebilirler. 

Tamam, müşteri rezervasyonlarını ve sorgularını ele almanın çok daha iyi yolları var. Ancak öğretici uğruna bu yaklaşıma sadık kalacağız.

Aşama 1

Öncelikle bir tablo oluşturmamız gerekiyor. Aşağıda gösterildiği gibi bizimki oldukça basittir; Yönetici, Zaman yuvası ve Sorgu ile yalnızca üç satır içerir.

Adım 2

Daha sonra, birisi sayfayı sorgusuyla güncellediğinde e-postaları tetiklemek ve böylece bir yer ayırtmak için Google komut dosyalarına ihtiyacınız var. İşte bir örnek. 

//@OnlyCurrentDoc function ProcessEdit(e) { MailApp.sendEmail({ to: "[email protected]" ;, Subject: "Yeni rezervasyon -- müşteri zaman dilimi", gövde: "Bir müşterinin size bir sorusu var." });

Kopyala

Neler olup bittiğini anlamanıza yardımcı olmak için ana işlevleri tartışmak faydalı olacaktır. 

  • //@OnlyCurrentDoc – bu ek açıklama, komut dosyasının yalnızca belirtilen Google E-Tablosunda çalışmasını istediğinizi belirtir. Ek açıklamanın kaldırılması, komut dosyasının diğer dosyalarınızda etkinleştirilmesini sağladı. 
  • işlev süreciDüzenle () – bir tetikleyici (sonraki adımda ayarlayacağız) betiği bu işlevle çalıştırır. Basitçe, işlev, birisi sayfayı her güncellediğinde e-posta alacak şekilde süreci ayarlar.
  • (e) – bu ek açıklama, düzenlemelerle ilgili verileri içeren nesneyi temsil eder. Bir aralığın veya hücrenin düzenlendiğini belirten range özelliğine sahiptir. 
  • MailApp – işlevin e-postayı iletmek için kullandığı bir nesne. 

Devam etmeden önce sayfayı ve kodu test edebilirsiniz. Örnek sayfayı kullanıyorsanız Sorgu sütununun altındaki hücrelerden birini doldurmanız ve betiği çalıştırmanız yeterlidir. E-postanın gelen kutunuza hemen ulaşması gerekir, ancak unutmayın, komut dosyası henüz otomatikleştirilmemiştir.

Aşama 3

E-postaları otomatik olarak göndermek için bir tetikleyici ayarlamanın ve yetkilendirmenin zamanı geldi. Apps Komut Dosyası'nda yan menüdeki çalar saat simgesini tıklayın. Ardından “…yeni bir tetikleyici oluştur” seçeneğini tıklayın. 

Tetikleyici yapılandırması açılır penceresinde aşağıdaki kriterleri seçin.

  • süreçDüzenle
  • KAFA
  • E-tablodan
  • Düzenlemede

Not: Arıza bildirimi ayarlarını varsayılan olarak tutmanızda sorun yoktur, ancak bunu değiştirebilirsiniz eğer gerekiyorsa. Tetikleyicinin veya betiğin genel çalışmasını etkilemez. Bu, otomatikleştirmek isteyebileceğiniz herhangi bir Google komut dosyası için geçerli olabilir. 

 Kaydet'yi tıklayın, tetikleyiciyi hesabınızda yetkilendirin; bunu 'de göreceksiniz. Tetikleyiciler listesi. Ayrıca, tetikleyiciyi etkinleştirmek için Dağıt düğmesine bastığınızdan emin olun. 

Artık sayfaya geri dönebilir, Sorgu sütununa başka bir hücre girebilir ve otomatik bildirim alıp almadığınızı kontrol edebilirsiniz. 

Yan Not: Sayfayı tercihlerinize göre özelleştirebilirsiniz ancak bu, komut dosyasını da özelleştirmeniz gerektiği anlamına gelir.

Tags: #HOW-TO

Zencefil 2.7.53.0

Zencefil 2.7.53.0

Ginger ücretsiz bir yazım ve dilbilgisi denetleyicisidir.

Bloklar

Bloklar

Blocks, ilkokul 3. sınıf öğrencilerinin algılama ve göz becerilerini geliştirmeye yönelik entelektüel bir oyundur ve öğretmenler tarafından BT öğretim destek programına dahil edilmiştir.

Prezi 6.26

Prezi 6.26

Prezi, hem çevrimiçi hem de çevrimdışı dijital sunumlar oluşturmanıza olanak tanıyan ücretsiz bir uygulamadır.

Mathway

Mathway

Mathway, cihazınızın yerleşik hesap makinesinden daha karmaşık bir araç gerektiren tüm matematik problemlerini çözmenize yardımcı olabilecek çok kullanışlı bir uygulamadır.

Adobe Sunucusu

Adobe Sunucusu

Adobe Presenter, Microsoft Windows platformunda Microsoft PowerPoint eklentisi olarak sunulan, Adobe Systems tarafından yayımlanan bir e-Öğrenim yazılımıdır.

ENetViet 24.2

ENetViet 24.2

eNetViet, ebeveynlerin çocuklarının eğitim gördüğü okulla bağlantı kurmasına yardımcı olan ve böylece çocuklarının mevcut öğrenme durumunu net bir şekilde anlayabilmelerine yardımcı olan bir uygulamadır.

Duolingo

Duolingo

Duolingo - Ücretsiz Dil Öğrenin veya kısaca Duolingo, birçok farklı dili öğrenmenize ve pratik yapmanıza olanak tanıyan bir eğitim programıdır.

MathType 7.4.10.53

MathType 7.4.10.53

MathType, geliştirici Design Science'ın (Dessci) sunduğu etkileşimli bir denklem yazılımıdır ve kelime işlem, sunumlar, e-Öğrenim vb. için matematiksel gösterimler oluşturmanıza ve açıklama eklemenize olanak tanır. Bu düzenleyici aynı zamanda TeX, LaTeX ve MathML belgeleri oluşturmak için de kullanılır.

Dilbilgisi açısından

Dilbilgisi açısından

Grammarly'nin yapay zeka destekli uygulamaları insanların daha etkili iletişim kurmasına yardımcı oluyor. Milyonlarca kullanıcı mesajlarını, belgelerini ve sosyal medya gönderilerini daha net, hatasız ve daha profesyonel hale getirmek için her gün Grammarly'ye güveniyor.

Canlı çalışma sayfaları

Canlı çalışma sayfaları

Canlı çalışma sayfaları, öğrenciler için etkileşimli alıştırmalar oluşturmak için yararlı bir araçtır. Öğretmenler için kullanımı kolaydır ve öğrenmeyi daha eğlenceli ve ilgi çekici hale getirebilir.