【GAS】GmailのURLをスプレッドシートに自動転送!コード全公開

Gmail

GASで制御する Gmail

Googleシートマスターのひろしです。

今回は、とっても価値の高い方法をお伝えします。


これを知ることであなたは、

  • コピペでGmail内のURLを自動的に抽出することができます。
  • トリガーを組み合わせることで、完全自動で取り込むことができます。

なので、サクッとマスターして

と答えてあげてください。

動画はこちら

シートはこちら

新規作成してください

 

スクリプト

function extractUrlsToSheet() {
  const spreadsheetId = 'スプレッドシートID'; // スプレッドシートID
 const configSheetName = '設定';
 
  const ss = SpreadsheetApp.openById(spreadsheetId);
  let configSheet = ss.getSheetByName(configSheetName);


  // 「設定」シートがない場合の初期作成
  if (!configSheet) {
    configSheet = ss.insertSheet(configSheetName);
    configSheet.getRange('A1:B3').setValues([
      ['書き込みシート名', 'シート1'],
      ['対象ラベル名', 'ラベル'],
      ['前回実行時刻', new Date(0)]
    ]);
    SpreadsheetApp.getUi().alert('「設定」シートを作成しました。B列の設定値を確認して再度実行してください。');
    return;
  }


  // 設定シートから各設定値を読み込む
  const dataSheetName = configSheet.getRange('B1').getValue();
  const labelName = configSheet.getRange('B2').getValue();
  const lastProcessedTime = new Date(configSheet.getRange('B3').getValue()).getTime();
 
  let dataSheet = ss.getSheetByName(dataSheetName);
  if (!dataSheet) {
    SpreadsheetApp.getUi().alert('シート「' + dataSheetName + '」が見つかりません。');
    return;
  }


  const label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    Logger.log("ラベル「" + labelName + "」が見つかりませんでした。");
    return;
  }


  let latestTimeInThisRun = lastProcessedTime;
  const threads = label.getThreads();
  const urlRegExp = /https?:\/\/[\w!?/+\-_~=;.,*&@#$%\(\)'[\]]+/g;


  threads.forEach(thread => {
    const messages = thread.getMessages();
    messages.forEach(message => {
      const messageTime = message.getDate().getTime();


      // 前回実行時間より新しいメールだけを処理
      if (messageTime > lastProcessedTime) {
        const body = message.getPlainBody();
        const urls = body.match(urlRegExp);
       
        if (urls) {
          urls.forEach(url => {
            dataSheet.appendRow([message.getDate(), url, message.getSubject()]);
          });
        }
       
        if (messageTime > latestTimeInThisRun) {
          latestTimeInThisRun = messageTime;
        }
      }
    });
  });


  // 最後に処理した時刻をB3セルに更新
  configSheet.getRange('B3').setValue(new Date(latestTimeInThisRun));
}

ポイント

  • 自動化の「トリガー」対応 GASのトリガー設定(時間主導型)を使うことで、1時間おきや1日おきなど、完全無人でリストを更新し続けることができます。

  • 階層ラベル(ネスト)への対応 Gmailの親ラベルと子ラベルを / で繋ぐ記述(例:親/子)に対応しており、細かく整理されたメール環境でもそのまま導入可能です。

  • 「設定シート」による一元管理 プログラムコードを書き換えなくても、スプレッドシート上のセルを書き換えるだけで「抽出対象のラベル」や「出力先のシート」を変更できる設計にしています。

  • 正規表現による正確なURL抽出 メール本文がどれほど長くても、正規表現を用いて http または https で始まる文字列を瞬時に見つけ出します。

  • 二重書き込みの防止 「前回実行した時刻」を記録し、それより後に受信したメールのみを判定対象とするため、同じURLが何度もシートに並ぶのを防ぎます。

 

注意点
  • 半角スペースの有無: Gmail上の表記と1文字でも違うとエラーになるため、もし動かない場合はスペースを消したり、全角・半角を入れ替えたりして試してみてください。

  • 親ラベルだけ指定した場合: 親ラベルを書くと、子ラベルに入っているメールは取得されず、親ラベル直下にあるメールのみが対象になります。

使用上の注意点
  • 1回あたりの処理上限 Gmailの getThreads() は一度に取得できるスレッド数に上限(デフォルトで最大500程度)があります。あまりにも大量の過去メールがあるラベルに適用する場合は、初回のみ手動で「前回実行時刻」を調整して少しずつ処理することをお勧めします。

  • スプレッドシートIDの書き換え スクリプト冒頭の spreadsheetId だけは、自身のシートURLから正しくコピーして貼り付ける必要があります。

  • 権限の承認 初回実行時には、Gmailとスプレッドシートへのアクセスを許可する認証画面が出ます。自分自身で作成したスクリプトなので、内容を確認して承認してください。

  • URLの形式 正規表現で抽出するため、URLの末尾に記号などが含まれている場合、稀に余分な文字を拾うことがあります。運用に合わせて正規表現の微調整が必要になる場合があります。

最後までご覧いただきありがとうございます。

つぎはこちら

【GAS】Gmailメールの送信元を別のメアドに変更する方法 バッファに取得しループ
  • メールの送信元を別のメールアドレスに変更できます。
  • GAS上でできるので、いろいろ使えます。
  • GASで制御する Gmail

    コメント

    タイトルとURLをコピーしました