1

スプレッドシートが変更されたとき、またはデータが追加されたときに電子メールを送信するために、Google スプレッドシートにスクリプトを記述しました。メールトリガーは機能していますが、次の行にデータが入力されるたびに、以前のメールアドレスにもメールが送信されます。

解決策を提案してください

以下は書かれたスクリプトです:

function onEdit(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 1;   // Number of rows to process
  var dataRange = sheet.getRange(startRow, 1 , numRows,3) // Fetch the range of cells A2:B3

  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
for (i in data) {
    var row = data[i];
    var emailAddress = row[2];  // First column
    var message = row[0] + "requested" + row [1];       // Second column
    var subject = "Sending emails from a Spreadsheet";
    MailApp.sendEmail(emailAddress, subject, message);
  }
}
4

2 に答える 2

0

あなたの質問は不明です...スクリプトのどこにも実際に変更されたセルを読み取るものはありません...ターゲット範囲は行2にハードコードされているため、処理できる唯一の行は行2です(メールは一度送信)...

そうすることができます:

  • それがどのように機能するかを説明する
  • 現在の仕組みを説明してください。特に「以前のメール」とはどういう意味ですか
  • コードのタイプミスを削除します (行 [2] は最初の列ではありません)
  • この関数をトリガーする方法を説明してください。名前onEdit(e)はonEditトリガーを示唆していますが、単純なトリガーはメールを送信できないため、他のトリガーを設定したと思います.
  • (e)関数パラメーターでそれを使用しない理由を説明してください。

編集:情報の補足に感謝します。あなたが提案したスクリプトは、あなたが望むものを達成するのに十分ではありません. ここでの考え方は、データの行を追加(または挿入) することによって、または (私がよく理解していれば)シート内の行を新しい値で編集することによって、シート内の何かが変更されたかどうかを確認することです。

これは一見しただけでは簡単ではありません ;-)

timerシートの「スナップショット」を取得し、またはに基づいて、onEditそのスナップショットをシートの現在の状態と比較します。

その結果を取得する方法は複数あります。スプレッドシートに 2 番目のシートを作成し、誰も変更できないようにすることができます。これは、各変更/メール送信後に更新するメイン シートのコピーです。そのため、スクリプトを更新する前に、シート間の違いを探し、違いが見つかった場合は対応する電子メールにレポートを送信する必要があります。

これを行う別の方法は、文字列に変換されたシート データをスクリプト プロパティに保存することです。原則は同じですが、スプレッドシートにアクセスする通常のユーザーには「見えません」。

scriptDb またはユーザー プロパティを使用することもできますが、このユース ケースにはおそらくスクリプト プロパティの方が適しています (より単純です)。

あなたの考え/好みを教えてください。私 (または他の誰か) は、おそらく最初にコードを提供できます。

于 2012-12-08T15:32:51.503 に答える
0

共有スプレッドシートを使用してユーザー追加要求を収集し、要求者が情報を入力することを信頼しているようです。あなたが共有した詳細ドキュメントでは、リクエストが追加されているように見えますが、編集されていません. (これは重要な単純化の違いです。)

本当に必要なのは、その入力を受け取るためのフォームを使用することです。フォームを使用すると、スプレッドシート内に「データ テーブル」が作成されます。これは、いじってはならない一連の列です。(内容の編集、行の追加と削除はできますが、列の追加と削除はできません。)ただし、このテーブルの外にあるスプレッドシートに列を追加することはできます。これにより、個々のステータスに関する状態情報を保存する便利な場所が得られます。リクエスト。

サンプルシート

さらに、単純な「onEdit」ではなく、フォームの送信時に処理を実行するようにトリガーできます。これにより、ScampMichael が指摘した問題を回避できます。または、この回答で説明されているように、インストール可能な編集トリガーを使用できます。

このシートこのフォームを試してみてください。自分でコピーを保存し、スクリプトに移動して、メールの送信を妨げているコメントを削除して、試してみてください。スプレッドシートには、処理を開始できるメニュー項目があります。「リクエスト状態」列をクリアして再実行してください。フォームを開いて (そしてその URL を見つけて)、さらにエントリを追加して実験することができます。

これは、私が作成した同様のシステムの中核であり、リクエストを処理するための個別のステート マシンが含まれています。私のシステムには、複数のスプレッドシートに大量の非常に複雑なデータがあるため、頻繁に先取りされ、再度実行する必要があります。(そのために時限トリガーを使用します。) そのため、リクエストは状態を通じて処理されます。複雑すぎる場合は、必要な部分だけを引き出してください。

于 2012-12-14T01:49:52.803 に答える