web-dev-qa-db-ja.com

Googleスプレッドシートで値が変更されたときにメールを送信する

私はGoogleスプレッドシートで次のことをどのように理解しようとしています。

  1. セルの値が変更されたときにメールを送信します。 (値=完了)。
  2. その行のデータを電子メールにコンパイルします。以下のコードのフォーマットを参照してください。
  3. 情報の確認をユーザーに求めます。
  4. はいの場合、アクティブユーザーと以下のコードのプリセットユーザーにメールを送信します。
  5. これはオプションです:送信された電子メール+タイムスタンプで列(P)16の行のシートを更新します。

こんにちはセルジュ、

あなたが提供したコードを実装しようとしましたが、私が必要なことを行うために何を変更するかについて頭や尾を作ることができませんでした。

以下のワークフローでもう一度説明します。

列Kの値が変更されたときにメールを送信します。

列Kを監視するための部分的なサンプルコード

var sheetNameToWatch = "Active Discs";
var columnNumberToWatch = 14; // column A = 1, B = 2, etc.
var valueToWatch1 = "Completed";
var valueToWatch2 = "in progress";

try{
var ss = e.source;
var sheet = ss.getActiveSheet();
var range = e.range;

if (sheet.getName() == sheetNameToWatch && range.columnStart == 
columnNumberToWatch && e.value == valueToWatch)

var confirm = Browser.msgBox
('Email will be sent Team X. Do you want to sent this email?', Browser.Buttons.YES_NO); 
if(confirm!='yes'){return};
// if user click NO then exit the function, else move data

電子メールには、その特定の行の指定された値が含まれます。例列A、B、C、D、E、F、G、H、I、Jの値。

//Email to be sent if **Inprogess** value is a match:

Var sendEmailTeamA(){

var ProjectName = e.values[0];
var ProjectId = e.values[1];
var ProjectManager = e.values[3];
var Sales = e.values[4];
var Client = e.values[5];
var DiscType = e.values[6];
var DVDFlash = e.values[7];
var Phase = e.values[8];
var Encryption = e.values[9];
var Qty = e.values[11];
var DueDate = e.values[12];
var SpecialInstructions = e.values[13];
var emailAddress = '';
var subject = "DVD Request - " + ProjectName + " " + ProjectId;
var emailBody = "Hi Venue Colombo Team,"
  "\n\nThe following data room(s) will need a disc creation. Please begin bulk save data room and create ISO to upload to the FTP site: " +
  "\nProject Name: " + ProjectName +
  "\nProject ID: " + ProjectId +
  "\nProject Manager: " + ProjectManager +
  "\nPhase: " + Phase +
  "\nDisc Type: " + DiscType +
  "\nEncryption: " + Encryption +
  "\nQuantity: " + Qty +
  "\nClient Due Date: " + DueDate +
  "\nSpecialInstructions: " + SpecialInstructions;
var htmlBody = "Thank you for your <b>Club Ambassador Program</b> report submitted on <i>" + timestamp +
  "</i><br/>&nbsp;<br/>Person Show Submitted this email: " +
  "<br/><font color=\"red\">Your Name:</font> " + activeSessionuser +
  "<br/>Your Email: " + toAddress;
var optAdvancedArgs = {name: "Club Ambassador Program", htmlBody: htmlBody};
MailApp.sendEmail(emailAddress, subject, emailBody, optAdvancedArgs);
}

//Email to be sent if **“Completed”** value is a match:

Var sendEmailTeamB() {

var ProjectName = e.values[0];
var ProjectId = e.values[1];
var ProjectManager = e.values[3];
var Sales = e.values[4];
var Client = e.values[5];
var DiscType = e.values[6];
var DVDFlash = e.values[7];
var Phase = e.values[8];
var Encryption = e.values[9];
var Qty = e.values[11];
var DueDate = e.values[12];
var SpecialInstructions = e.values[13];
var emailAddress = '';
var subject = "DVD Request - " + ProjectName + " " + ProjectId;
var emailBody = "Hi Venue Colombo Team,"
  "\n\nThe following data room(s) will need a disc creation. Please begin bulk save data room and create ISO to upload to the FTP site: " +
  "\nProject Name: " + ProjectName +
  "\nProject ID: " + ProjectId +
  "\nProject Manager: " + ProjectManager +
  "\nPhase: " + Phase +
  "\nDisc Type: " + DiscType +
  "\nEncryption: " + Encryption +
  "\nQuantity: " + Qty +
  "\nClient Due Date: " + DueDate +
  "\nSpecialInstructions: " + SpecialInstructions;
var htmlBody = "Thank you for your <b>Club Ambassador Program</b> report submitted on <i>" + timestamp +
  "</i><br/>&nbsp;<br/>Person Show Submitted this email: " +
  "<br/><font color=\"red\">Your Name:</font> " + activeSessionuser +
  "<br/>Your Email: " + toAddress;
var optAdvancedArgs = {name: "Club Ambassador Program", htmlBody: htmlBody};
MailApp.sendEmail(emailAddress, subject, emailBody, optAdvancedArgs);
}

このワークフローは、列K、L、M、N、Oに適用されます。電子メールは、コードで事前設定された電子メールアドレスに送信されます。これが少し良く説明してくれることを願っています。お手数をおかけしますが、よろしくお願いいたします。

10
WallyG

私はあなたを始めることができます:

  1. リソース>現在のプロジェクトのトリガーにトリガーを追加します。これにより、「編集時に」sendEmail()がトリガーされます。
  2. .。
1
Andrew Roberts

そのようなことを行うスクリプトを書いたばかりですが、シート内のすべての変更を監視し、mailBoxのスパムを避けるために1時間に1回だけメッセージを送信するようにしたかったのです。

スクリプトには2つの機能があります。1つは変更を収集してテキスト形式で保存し、もう1つは過去1時間に変更が発生した場合に電子メールを送信します。

最初の関数はgrabDataと呼ばれ、onEditのインストール可能なトリガーによってトリガーされる必要があり、次のようになります。

function grabData(e){
  Logger.log(JSON.stringify(e));
  var cell = e.range.getA1Notation();
  var user = e.user.email;
  var time = Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'dd-MM-yyyy')+' à '+Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'hh:mm');;
  if(user!='[email protected]'&&cell!='A1'){ 
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  if(dataUser1==null){dataUser1=''};
  dataUser1+='\nCellule '+cell+' modifiée le '+time+' par '+user+' (nouvelle valeur = '+e.range.getValue()+')';
  PropertiesService.getScriptProperties().setProperty('contentUser1',dataUser1);
  }
  if(user!='[email protected]'&&cell!='A1'){
  var dataUser2 = PropertiesService.getScriptProperties().getProperty('contentUser2');
  if(dataUser2==null){dataUser2=''};
  dataUser2+='\nCellule '+cell+' modifiée le '+time+' par '+user+' (nouvelle valeur = '+e.range.getValue()+')';
  PropertiesService.getScriptProperties().setProperty('contentUser2',dataUser2);
}
}

もう1つの関数にはタイマートリガーがあります。1時間ごとに起動するように設定しましたが、最適なものに変更できます。

function sendReport(){
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  var dataUser2 = PropertiesService.getScriptProperties().getProperty('contentUser2');
  if(dataUser1.length>1){
    MailApp.sendEmail('[email protected]', 'Modification dans le planning FFE', dataUser1);
    PropertiesService.getScriptProperties().setProperty('contentUser1','');
  }
  if(dataUser2.length>1){
    MailApp.sendEmail('[email protected]', 'Modification dans le planning FFE', dataUser2);
    PropertiesService.getScriptProperties().setProperty('contentUser2','');
  }
}

メール送信後、保存されているデータは削除されます。変更が記録されていない場合、メールは送信されません。

また、私には2人の異なるユーザーと2つの異なる保管場所があるので、それぞれが自分の変更について通知を受けることなく、相手が何をしているかを確認できます。

どちらの関数もインストール可能なトリガーを使用するため、これはアカウントで実行されます。タイマーを非常に短い期間に設定した場合は、クォータを爆発させないように注意してください。

1
Serge insas