簡體   English   中英

如何使用過濾的 forEach 循環將 (SetValues) 寫入 Google 表格?

[英]How to write (SetValues) to a Google Sheet using a filtered forEach loop?

我已經嘗試了幾個小時以使以下 Google Apps 腳本正常工作。 它需要做的是向以下任何人發送電子郵件(來自 html 模板):

  • 有一個完整的事件時間表(如果他們被分配到至少 4 個事件,則該時間表已完成,這在 Q 列中計算);
  • 之前沒有發送過 email(在 R 列中跟蹤);

該腳本跟蹤 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.pushmailSucces.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的這種變體

https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow,-column,-numrows,-numcolumns

您的數據具有不固定的行數和固定的列數 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM