私は、ユーザーが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);
}
}
これはあなたができることです:
これにより、新しい行を追加し続けることができ、コードは引き続き機能します。そして、コードがシートの下部にある式を台無しにしないでください。
または、次のコードを使用します。
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()
関数を使用して有効な電子メールアドレスを確認することをお勧めします。
正しく理解できたら、@を#に置き換えて、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);
}