👌

追加

2024/10/19に公開
function getNewEmailsByToAddressToSheet() {
  // 現在の日付を取得
  var today = new Date();
  
  // 処理対象の開始日と終了日を設定
  var startDate = new Date('2024-10-01');
  var endDate = new Date('2024-10-31');

  // 現在の日付が指定した期間外なら、処理を終了
  if (today < startDate || today > endDate) {
    return;
  }

  // メール検索用の宛先とCCアドレスを指定
  var toAddress = "@gmail.com";
  var ccAddress = "@gmail.com";
  
  // アクティブなスプレッドシートとシート名を取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "シート1";
  var sheet = spreadsheet.getSheetByName(sheetName);

  // シートが存在しない場合、エラーメッセージを出して終了
  if (!sheet) {
    throw new Error("指定されたシートが見つかりません: " + sheetName);
  }

  // シートの1行目にヘッダーが設定されていない場合、ヘッダーを設定
  if (sheet.getRange(1, 1).getValue() !== "No.") {
    sheet.getRange(1, 1).setValue("No.");           // No.列
    sheet.getRange(1, 2).setValue("Check");         // チェックボックス列
    sheet.getRange(1, 3).setValue("担当者");         // 担当者列
    sheet.getRange(1, 4).setValue("記入者");         // 記入者列
    sheet.getRange(1, 5).setValue("受信時間");       // 受信時間列
    sheet.getRange(1, 6).setValue("件名");           // 件名列
  }

  // 担当者と記入者のリストを定義
  var responsiblePersons = ["対応中", "対応不要", "対応不要"];
  var authors = ["記入者A", "記入者B", "記入者C"];
  
  // 当日0時と翌日0時を取得し、検索範囲を1日に限定
  var startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);
  var endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1, 0, 0, 0);

  // Gmail検索のためにタイムスタンプを取得
  var startTime = Math.floor(startOfDay.getTime() / 1000);
  var endTime = Math.floor(endOfDay.getTime() / 1000);

  // Gmailの検索クエリを作成
  var query = 'to:' + toAddress + ' OR cc:' + ccAddress + ' after:' + startTime + ' before:' + endTime;

  // クエリに基づいてGmailスレッドを検索
  var threads = GmailApp.search(query);

  // 既存のデータを取得するための関数
  function getExistingData(sheet) {
    var lastRow = sheet.getLastRow();
    if (lastRow > 1) {
      // 既存データ(受信時間と件名)を取得して返す
      return sheet.getRange(2, 5, lastRow - 1, 2).getValues();
    }
    return [];
  }

  // シートの既存データを取得
  var existingData = getExistingData(sheet);
  // 新しいデータを書き込むための行を設定
  var row = sheet.getLastRow() + 1;

  // 検索した各スレッドに対して処理を行う
  for (var i = 0; i < threads.length; i++) {
    // 各スレッド内のメッセージを取得
    var threadMessages = threads[i].getMessages();

    // メッセージを日付順に並べ替える
    threadMessages.sort(function(a, b) {
      return a.getDate().getTime() - b.getDate().getTime();
    });

    // 各メッセージに対して処理を行う
    for (var j = 0; j < threadMessages.length; j++) {
      var message = threadMessages[j];
      var subject = message.getSubject(); // 件名を取得
      var date = message.getDate();       // 受信時間を取得
      // 日付をフォーマットしてMM/dd/HH:mm形式に変換
      var formattedDate = Utilities.formatDate(date, Session.getScriptTimeZone(), "MM/dd/HH:mm");

      // 既存データと比較して、重複しているかを確認
      var isDuplicate = existingData.some(function(existingRow) {
        return existingRow[0] === formattedDate && existingRow[1] === subject;
      });

      // 重複している場合、このメッセージをスキップ
      if (isDuplicate) {
        continue;
      }

      // 重複していない場合、新しい行にデータを書き込む
      sheet.getRange(row, 1).setValue(row - 1);       // No.を設定
      sheet.getRange(row, 5).setValue(formattedDate); // 受信時間を設定
      sheet.getRange(row, 6).setValue(subject);       // 件名を設定
      sheet.getRange(row, 2).insertCheckboxes();      // チェックボックスを挿入

      // 担当者列にデータバリデーション(リストから選択)を設定
      var responsibleCell = sheet.getRange(row, 3);
      var responsibleRule = SpreadsheetApp.newDataValidation().requireValueInList(responsiblePersons).build();
      responsibleCell.setDataValidation(responsibleRule);

      // 記入者列にデータバリデーション(リストから選択)を設定
      var authorCell = sheet.getRange(row, 4);
      var authorRule = SpreadsheetApp.newDataValidation().requireValueInList(authors).build();
      authorCell.setDataValidation(authorRule);

      // 次の行に移動
      row++;
    }
  }
}

Discussion