見出し画像

GmailをObsidianに保存

Gmail を Obsidian に保存するには?に悩み、以下のような結論になりました。ちなみに、私の技量はというと、Google Apps Script を自分で作成するとか、無理無理、絶対無理、な感じです。なので、将来同じ轍を踏まないように、備忘録的な感じで書いておきます。

  1. Gmail のアドオンを作成

    • メールの内容を Markdown 形式に変換する

    • メールの添付ファイルがリンクされるように、最後に「 ![[ファイル名]] 」を記入する

    • Markdown 形式のファイルと、メールの添付ファイルを、Google Driveに保存

  2. Google Drive に保存された Markdown のファイルとメールの添付ファイルを、Obsidian にドラッグして投げる。


Google Apps Script

90%は Claude に作ってもらいました。
ただし、真っ白からはダメだったので、以下のページのbuildAddOn関数のスクリプトを参考に作ってね!って感じです。

コード.gs

プロジェクトを作成すると最初に「コード.gs」が開いているので、プロジェクトの名前を変更し、コードを書く。

最初の画面
// コード.gs

function buildAddOn(e) {
  var accessToken = e.messageMetadata.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  var messageId = e.messageMetadata.messageId;
  var message = GmailApp.getMessageById(messageId);

  var conversionResult = convertMessageToMarkdown(message);

  var resultText = conversionResult ? "Markdownへの変換が完了しました。" : "変換中にエラーが発生しました。";

  var resultWidget = CardService.newTextParagraph()
    .setText(resultText);

  var section = CardService.newCardSection()
    .addWidget(resultWidget);

  var card = CardService.newCardBuilder()
    .setHeader(CardService.newCardHeader().setTitle("Markdown変換結果"))
    .addSection(section)
    .build();

  return [card];
}

function convertMessageToMarkdown(message) {
  // markdownファイルを保存するGoogle ドライブのフォルダID
  var folderId = "Google ドライブのフォルダID";

  var subject = message.getSubject();
  var body = message.getBody();
  var date = message.getDate();
  var attachments = message.getAttachments();

  // メール本文をmarkdownに変換
  var markdown = convertHtmlToMarkdown(body);

  // 添付ファイル名を追加
  if (attachments.length > 0) {
    markdown += "\n\n";
    for (var i = 0; i < attachments.length; i++) {
      var attachmentName = attachments[i].getName();
      markdown += "![[" + attachmentName + "]]\n";
    }
  }

  // ファイル名の生成
  var fileName = subject + "_" + Utilities.formatDate(date, "JST", "yyyyMMdd_HHmmss") + ".md";

  // markdownをGoogle ドライブに保存
  var folder = DriveApp.getFolderById(folderId);
  folder.createFile(fileName, markdown);

  // 添付ファイルをGoogle ドライブに保存
  for (var i = 0; i < attachments.length; i++) {
    var attachmentBlob = attachments[i].copyBlob();
    folder.createFile(attachmentBlob);
  }

  return true;
}

function convertHtmlToMarkdown(html) {
  // HTMLをmarkdownに変換するための関数
  // 必要に応じて変換ロジックを追加・修正してください

  // 例: シンプルなHTMLタグの除去
  var markdown = html.replace(/<[^>]+>/g, "");

  // 「-」が5個以上ある行を"-----"に変更し、必要に応じて改行を追加
  markdown = markdown.replace(/^(-{5,})$/gm, function(match, p1) {
    var previousLine = markdown.slice(0, markdown.indexOf(match)).trim();
    if (previousLine !== "") {
      return "\n-----";
    }
    return "-----";
  });

  // 「=」が5個以上ある行を"-----"に変更し、必要に応じて改行を追加
  markdown = markdown.replace(/^(={5,})$/gm, function(match, p1) {
    var previousLine = markdown.slice(0, markdown.indexOf(match)).trim();
    if (previousLine !== "") {
      return "\n-----";
    }
    return "-----/";
  });

  return markdown;
}

プロジェクトの設定(マニフェスト)

「appsscript.json」マニフェスト ファイルをエディタで表示する、にチェック。

マニフェスト ファイルのチェック

エディタに戻ると、「appsscript.json」が作成されて/いるので、以下を記述する。

appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "MYSELF"
  },
  "oauthScopes": [
    "https://mail.google.com/",
    "https://www.googleapis.com/auth/gmail.addons.execute",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/drive.readonly",
    "https://www.googleapis.com/auth/drive"
  ],
  "gmail": {
    "name": "to Markdown",
    "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/label_googblue_24dp.png",
    "contextualTriggers": [
      {
        "unconditional": {},
        "onTriggerFunction": "buildAddOn"
      }
    ],
    "openLinkUrlPrefixes": [
      "https://mail.google.com/"
    ],
    "primaryColor": "#FF0000",
    "secondaryColor": "#0000ff"
  },
  "urlFetchWhitelist": [
    "https://script.google.com/"
  ]
}

プロジェクトの設定(GSPプロジェクト)

GCPプロジェクトは、最初に作らなければならないのかもです。私はきっと、何かで昔に作ってた感じでした。その辺は調べてみてください。

「プロジェクトを変更」をクリック

プロジェクトを変更

「こちら」をクリック。

こちら

プロジェクトの番号をコピー

プロジェクト番号

プロジェクトの番号を貼り付けて、「プロジェクトを設定」をクリック。

プロジェクトの番号

ここでOAuth認証が何たらと言われるかもしれない。以下を参考にさせてもらいました。

GSPプロジェクトの設定

エラーで実行できなかったので、Gmail と Google Drive のAPIが必要なのかな?と、以下のページで検索して、「Gmail API」と「Google Drive API」を有効にしました。

アドオンのインストール

再び、Google Apps Scriptの画面。
右上の「デプロイ」から「新しいデプロイ」をクリックし、「アドオン」を選択して、「デプロイ」をクリック。

デプロイ

もう一度、右上の「デプロイ」から「デプロイをテスト」をクリックし、「インストール」をクリック。

インストール

Gmailのアドオン

Gmailを開くとアドオンができているので、メール開いてクリックすると、Google Drive に保存される。

Gmailのアドオン

この記事が気に入ったらサポートをしてみませんか?