web-dev-qa-db-ja.com

メールを送信し、「@」を「#」に置き換える方法

私は、ユーザーが2列目である電子メール(1列目)を受け取るスクリプトを作成しようとしています。しかし、その後、電子メールの「@」を「#」に置き換えて、再度メールを受け取ります。

スクリプトで最後のアクティブな行を使用できることはわかっていますが、残りの行に数式があるため、アクティブであると見なされるため、スクリプトを実行できません。

私が持っているものは次のとおりです。

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 2000;   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 2)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    var subject = "Quiz Results";
    MailApp.sendEmail(emailAddress, subject, message);
  }
}
2
Jared

これはあなたができることです:

  • すべての行を調べて、有効な電子メールアドレスを持つ最初の行を見つけます
  • 無効な電子メールアドレスが見つかるまで続行します
  • 範囲内のすべてのデータを取得し、「@」を「#」に変更します

これにより、新しい行を追加し続けることができ、コードは引き続き機能します。そして、コードがシートの下部にある式を台無しにしないでください。

または、次のコードを使用します。

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var lastRow = sheet.getLastRow();  // Last row with content

  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, lastRow - startRow + 1, 2);
  // Fetch values for each row in the Range.

  var list_start = -1; // index of first valid e-mail address
  var list_end = -1; // index of last valid e-mail address

  var subject = "Quiz Results";
  var data = dataRange.getValues();

  // can't use
  //     for (i in data)
  // because we want i to be integer
  for (i = 0; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    if (emailAddress.search("@") > 0) {
      MailApp.sendEmail(emailAddress, subject, message);
      if (list_start < 0) {
        list_start = i;
      }
    } else {
      if (list_start >= 0) {
        list_end = i-1;
        break;
      }
    }
  }

  if ((list_start >= 0) && (list_end < 0)) {
    // we reached the end of list and didn't find an invalid address
    list_end = lastRow - startRow - list_start + 1;
  }

  // convert all @ to #
  if (list_start > 0) {
    // this time, get only one column
    dataRange = sheet.getRange(startRow + list_start, 1, (list_end - list_start) + 1);
    data = dataRange.getValues();
    for (i in data) {
      data[i][0] = data[i][0].replace("@","#");
    }
    dataRange.setValues(data);
  }

}

コードは、単純な電子メールアドレス検証を使用します。より良い結果を得るには、非表示の列を作成し、 isemail() 関数を使用して有効な電子メールアドレスを確認することをお勧めします。

1
daniel

正しく理解できたら、@を#に置き換えて、MailApp.sendEmailが再びメールを送信しないようにします。これは理にかなっています(この目的のために別の列 "Processed"を追加します)が、forループはAPIを不必要に1,000回呼び出して、無効な電子メール文字列を渡すべきではありません。

ちなみに、配列で「for .. in ..」を使用するには 推奨しません です。これは私がすることです:

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 2;   // Number of rows to process; put 2000 here later
  var dataRange = sheet.getRange(startRow, 1, numRows, 2)
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    var subject = "Quiz Results";
    if (/@/.test(emailAddress)) {
      // MailApp.sendEmail(emailAddress, subject, message); // commented out for debugging
      Logger.log([emailAddress, subject, message]);  // Logs what would be sent, for debugging
      data[i][0] = emailAddress.replace('@', '#');
    }
  }
  dataRange.setValues(data); 
}
1
user79865