[英]How to write (SetValues) to a Google Sheet using a filtered forEach loop?
我已經嘗試了幾個小時以使以下 Google Apps 腳本正常工作。 它需要做的是向以下任何人發送電子郵件(來自 html 模板):
該腳本跟蹤 S 列中的錯誤,即是否沒有提供 email 地址。
看來它只有效:
如果我注釋掉
data = data.filter(function(r){ return r[17] == true & r[16] > 3});
或者如果我注釋掉
ws.getRange("S3:S" + ws.getLastRow()).setValues(errors); ws.getRange("R3:R" + ws.getLastRow()).setValues(mailSucces);
我怎樣才能讓這個腳本正常工作? 我指的谷歌表格的副本是這個: https://docs.google.com/spreadsheets/d/1sbOlvLVVfiQMWxNZmtCLuizci2cQB9Kfd8tYz64gjP0/edit?usp=sharing
到目前為止,這是我的代碼:
function SendEmail(){
var voornaam = 3;
var achternaam = 4;
var email = 5;
var event1 = 9;
var event2 = 10;
var event3 = 11;
var event4 = 12;
var event5 = 13;
var event6 = 14;
var event7 = 15;
var emailTemp = HtmlService.createTemplateFromFile("email");
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Events Day 1");
var datum = ws.getRange(1,3).getValue();
var spreker = ws.getRange(1,6).getValue();
var data = ws.getRange("A3:R" + ws.getLastRow()).getValues();
data = data.filter(function(r){ return r[17] == false && r[16] > 3}); //Either this needs to be commented out...
let errors = [];
let mailSucces = [];
data.forEach(function(row){
try{
emailTemp.voornaam = row[voornaam];
emailTemp.email = row[email];
emailTemp.datum = datum;
emailTemp.spreker = spreker;
emailTemp.event1 = row[event1];
emailTemp.event2 = row[event2];
emailTemp.event3 = row[event3];
emailTemp.event4 = row[event4];
emailTemp.event5 = row[event5];
emailTemp.event6 = row[event6];
emailTemp.event7 = row[event7];
var htmlMessage = emailTemp.evaluate().getContent();
GmailApp.sendEmail(
row[email],
"Here you go! Your personal schedule for the event of " + datum,
"Your emailprogramm doesn't support html.",
{
name: "Event Organisation Team", htmlBody: htmlMessage, replyTo: "info@fakeemail.com"
});
errors.push([""]);
mailSucces.push(["TRUE"]);
}
catch(err){
errors.push(["Error: no message sent."]);
mailSucces.push(["False"]);
}
}); //close forEach
ws.getRange("S3:S" + ws.getLastRow()).setValues(errors); //or this and the next line need to be commented out.
ws.getRange("R3:R" + ws.getLastRow()).setValues(mailSucces);
}
編輯我一直在嘗試和思考......但仍然沒有找到如何讓它發揮作用。 但我也理解了為什么它不起作用; 我只是不知道如何修復它。 讓我再詳細說明一下這個問題:問題是,在forEach
循環中,范圍是數據的過濾變體,使用getValues
從電子表格中提取。 因此,使用ws.getRange("R3:R" + ws.getLastRow()).setValues(mailSucces);
寫回數據導致電子表格中的復選標記不匹配。 所以,不知何故我需要把以前使用的過濾器的范圍data = data.filter(function(r){ return r[17] == false & r[16] > 3});
在變量中...? 我猜?
此外,我認為在循環中使用setValue
並不明智,因為(根據我從對該主題的搜索中了解到)這會導致腳本變慢,因為腳本的每個循環都會調用 API 來寫入電子表格. 因此, errors.push
和mailSucces.push
以及我在循環結束后嘗試在最后做一個 setValue 的嘗試。
有人可以幫我完成這個問題嗎?
問題是您寫入的范圍和您正在寫入的數據的大小不同。
嘗試更換:
ws.getRange("S3:S" + ws.getLastRow()).setValues(errors);
ws.getRange("R3:R" + ws.getLastRow()).setValues(mailSucces);
和:
ws.getRange(3, 19, errors.length, 1).setValues(errors);
ws.getRange(3, 18, mailSucces.length, 1).setValues(mailSucces);
您應該使用getRange的這種變體
您的數據具有不固定的行數和固定的列數 (1)。 在一般情況下,您的數據將是 X 行和 Y 列的矩陣。 為此,您可以使其完全動態:
sheet.getRange(startRow, startColumn, data.length, data[0].length)
在執行此操作之前,請確保 data.length > 0,否則 data[0].length 會中斷。
編輯:我開始寫評論,但太長了。 有幾件事可能 go 發送電子郵件出錯。 我注意到的第一件事是您在過濾器中使用& ,但在 AppsScript/JavaScript/C-like-languages 中,您應該使用&&進行邏輯與。 現在是 email:您只能使用 catch 塊檢測代碼中斷。 在這一點上,你不知道為什么代碼會破壞它可能是任何東西。 使用 GmailApp,我建議您在開發時使用 createDraft,然后在一切正常后將其替換為 sendEmail 以獲得最終版本,這兩個函數具有完全相同的參數,謝謝 Google 開發人員;-)。
要找出確切的問題,您應該在中斷時收到錯誤消息並顯示它。 err.stack應該告訴你幾乎所有的東西:
catch(err){
Logger.log(err.stack); // Added
errors.push(["Error: no message sent."]);
mailSucces.push(["False"]);
}
從代碼編輯器運行sendEmail function,您應該會看到每個 catch(err) 傳遞的日志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.