GmailでGoogleAppsScriptを実行できません

Oct 01 2020

毎週特定の時間にGmailの自動応答を送信するために、何らかの方法で投稿されたスクリプトに従いましたか?。ただし、現在のテストでは、Gmailアカウントは、勤務時間外にメッセージを返信しませんでした。

私は何か間違ったことや不完全なことをしましたか?

私がやった事:

  1. でスクリプトを作成しました https://script.google.com/ コピーと貼り付けを介して。
  2. スクリプトを保存してテストしました。それはうまくいきました。ここに画像の説明を入力してください
function myFunction() {
  function autoReply() {
var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([4,5,6,0].indexOf(day) > -1 || (day == 1 && hour < 9) || (day == 3 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      if (threads[i].isUnread()){
      threads[i].reply("xxxx");
      threads[i].markRead();
      threads[i].markImportant();
      }
    }
  }
}
}
  1. [高度なGoogleサービス]メニューからGmailAPIを有効にし、ここに画像の説明を入力します
  2. 5分ごとにスクリプトのトリガーを設定します。ここに画像の説明を入力してください
  3. 別のGmailアカウントからいくつかのテストメールを送信して、自動返信があるかどうかを確認しました。
  4. 別のアカウントから受信したメールを手動で変更しませんでした。

ヒントは大歓迎です!

更新:次のスクリプト自体が「スクリプト関数が見つかりません:myFunction」エラーになるのはなぜですか?

function autoReply() {
  
  // find calendar event
  var today = new Date();
  var events = CalendarApp.getDefaultCalendar().getEventsForDay(today, { search: 'OOF' });
  var unavailableToday = false;
  for (var i = 0; i < events.length; i++) {
    
    if(events[i].isAllDayEvent() && events[i].isOwnedByMe()) {
      
      unavailableToday = true;
      break;
      
    }
    
  }
  
  var myEmail = Session.getEffectiveUser().getEmail();
  
  Logger.log('unavailableToday');
  Logger.log(unavailableToday);
  if(unavailableToday === true) {
    
    // get html message
    var files = DriveApp.getRootFolder().getFilesByName('autoreply.html');
    var htmlbody;
    while (files.hasNext()) {
      var file = files.next();

      htmlbody = file.getBlob().getDataAsString('utf8');
      
    }
   
    // get emails
    var interval = 2;
    var date = new Date();
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox !label:autoresponded after:' + timeFrom);
    var label = GmailApp.getUserLabelByName("autoresponded");

    for (var i = 0; i < threads.length; i++) {
      
      var message = threads[i].getMessages()[0];
      if (message.getFrom().indexOf(myEmail) < 0 && message.getFrom().indexOf("no-repl") < 0 && message.getFrom().indexOf("bounce") < 0 && message.getFrom().indexOf("spam") < 0) {
        
        Logger.log("Replied now");
        
        // reply
        threads[i].reply("", {
          htmlBody: htmlbody
        });
        
        // label
        label.addToThread(threads[i]);
        
      }
      
    }
    
  }
  
}

MyFunction {}が不可欠だと思ったのはなぜですか?

回答

3 RafaGuillermo Oct 01 2020 at 15:29

回答:

autoReply()外部の関数を削除しmyFunction()、トリガーをに設定する必要がありautoReply()ます。

詳しくは:

コードは、リンクした回答のようになります。

function autoReply() {
  var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
    }
  }
}

このようではありません:

function myFunction() {
  function autoReply() {
    var interval = 5;    //  if the script runs every 5 minutes; change otherwise
    var date = new Date();
    var day = date.getDay();
    var hour = date.getHours();
    if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
      var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
      var threads = GmailApp.search('is:inbox after:' + timeFrom);
      for (var i = 0; i < threads.length; i++) {
        threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
      }
    }
  }
}

autoReply()を呼び出すときに呼び出されるのではなくmyFunction()、宣言されるだけです。

コードを編集してから、で実行するようにトリガーを再設定する必要がありますautoReply()。

w3schoolsから:

宣言された関数はすぐには実行されません。それらは「後で使用するために保存」され、後で呼び出された(呼び出された)ときに実行されます。

これがお役に立てば幸いです。

参照:

  • JavaScript関数の定義-w3schools