PDFとスプレッドシートとの一致を探す

Google Apps Script

PDFに記載された証券コード一覧の中に、自分の保有する株が含まれているかどうかを調べようと思いました。

PDFファイルに書かれた表の内容と、自分のスプレッドシートの内容で一致するデータを探したいとき、一つずつ目視で探すのは不便です。

ここで、テキストがコピペできるPDFファイルであれば、割と楽にGASで処理可能です。

PDFファイルのアップロードとIDの取得

GoogleDriveにPDFファイルをアップロードしておきます。
アップロードしたPDFを表示すると、このような感じです。

PDF閲覧

右上の三点メニューから、[新しいウィンドウで開く] を選び、PDFを新しいウィンドウ(もしくはタブ)で表示させます。

PDFメニュー

開いたウィンドウのURLをコピーし、そのURLの中で、https://drive.google.com/file/d/ の後かつ /view の前にある文字列が、ファイルIDです。
これをコピーして、後で使えるようにしておきます。

アドレスバー

スプレッドシートの準備

Googleスプレッドシートを開き、シート名を[元データ]とします。
A列に[コード]、B列に[銘柄] として、保有する株の一覧を用意しておきました。

銘柄で検索するのは、「(株)」が付いたり付かなかったり、はたまた「株式会社」と書いてあったり略称であったりと、表記ゆれが多く突合するのが難しいため、証券コードで検索するのが無難です。

手持ちの銘柄一覧

メニューの [拡張機能]>[Apps Script] で、GASのスクリプトエディタを開きます。

Apps Script起動

Advanced Drive APIの有効化

スクリプトエディタの左側にあるメニューから、[サービス +] を選択します。

AppsScriptメニュー

[サービスを追加] 画面で、[Drive API] を探して [追加] をクリックします。

API追加

Script入力

スクリプトエディタで元から入力されている
function myFunction() {
}
を消して、以下のコードを入力します。

Drive上のPDFファイルのID には先ほど取得したIDを入力してください。
出力先シート名と元データのシート名も適宜変更します。

function convertPdfToGoogleDoc() {
  const pdfFileId = 'PDFのID'; // Drive上のPDFファイルのID
  const sheetName = 'PDF一致銘柄'; // 出力先シート名
  const dataSheetName = '元データ'; // 元データ(コード・銘柄)のシート名

  // 1. PDFをGoogleドキュメントに変換(Advanced Drive APIのDrive.Files.copy()を使用)
  const resource = {
    title: 'temp_converted_doc_for_extraction',
    mimeType: MimeType.GOOGLE_DOCS
  };
  const newFile = Drive.Files.copy(resource, pdfFileId);
  const docId = newFile.id;
  Logger.log('変換されたGoogleドキュメントID: ' + docId);

  try {
    // 2. Googleドキュメントからテキストを取得
    const doc = DocumentApp.openById(docId);
    const text = doc.getBody().getText();

    // 3. 証券コード抽出(4桁の数字 または 3桁の数字 + 英字1文字)
    const codePattern = /\b(?:\d{4}|\d{3}[A-Za-z])\b/g;
    const matchedCodes = [...new Set(text.match(codePattern) || [])];

    // 4. スプレッドシート準備
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    let sheet = ss.getSheetByName(sheetName);
    if (!sheet) {
      sheet = ss.insertSheet(sheetName);
    } else {
      sheet.clear();
    }

    sheet.getRange(1, 1).setValue('証券コード');
    sheet.getRange(1, 2).setValue('銘柄');

    // 5. 元データのコードと銘柄を辞書に格納
    const dataSheet = ss.getSheetByName(dataSheetName);
    if (!dataSheet) {
      throw new Error(`元データシート「${dataSheetName}」が見つかりません`);
    }
    const data = dataSheet.getDataRange().getValues();
    const codeToName = {};
    for (let i = 1; i < data.length; i++) {
      const code = data[i][0].toString().trim();
      const name = data[i][1];
      codeToName[code] = name;
    }

    // 6. 一致したコードと銘柄をスプレッドシートに出力
    const output = [];
    matchedCodes.forEach(code => {
      if (codeToName[code]) {
        output.push([code, codeToName[code]]);
      }
    });

    if (output.length > 0) {
      sheet.getRange(2, 1, output.length, 2).setValues(output);
    } else {
      sheet.getRange(2, 1).setValue('一致なし');
    }

  } finally {
    // 7. 変換したGoogleドキュメントをゴミ箱に入れて自動削除(復元可能)
    DriveApp.getFileById(docId).setTrashed(true);
    Logger.log('変換ドキュメントをゴミ箱に移動しました: ' + docId);
  }
}

スクリプト保存後に実行すると、[PDF一致銘柄]シートが作成され、PDFにあるコードとスプレッドシートにあるコードが一致するものの一覧が出力されます。
ついでに銘柄も出力されるようにしました。

出力結果

一時的にPDFをドキュメントに書き出してから処理し、最後にそのドキュメントをゴミ箱に入れる、という仕様です。
実行するたびにゴミ箱にドキュメントファイルが増えていきますので、適宜消去してください。

ゴミ箱

コメント

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