PDFとスプレッドシートとの一致を探す(汎用版)

Google Apps Script

前回、証券コードである「4桁の数字」か「3桁の数字+A」を探して収集しました。

もう少し汎用性を上げて、「PDFのID」と「抽出条件」をシートに入力し、それを読み取って動作させるように、コードを書き直しました。
[比較データ] シートの一致した行を転記するようにしてあります。
また、シート上のボタンを押すことでコードを実行できるようにしました。

シート用意

手元にあるデータのシート名を [比較データ]、結果を出力するシート名を [PDF一致] としておきます。
更に、条件を入力するシート [条件] を作成します。

用意するシート

[条件]シートに、「PDFのID」(B1セル)と「抽出条件」(B3)を入力しました。

条件入力

コード

以下のコードを実行します。
前回、「4桁の数字 または 3桁の数字 + 英字1文字」で抽出しましたが、今のところ最後の英字は「A」しかないので、Aかaだけを探すように書き換えました。

function convertPdfToGoogleDoc() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const conditionSheet = ss.getSheetByName('条件');
  const dataSheetName = '比較データ';
  const outputSheetName = 'PDF一致';

  // ▼ 条件シートからPDF IDと正規表現を取得
  const pdfFileId = conditionSheet.getRange('B1').getValue().toString().trim();
  const regexPatternStr = conditionSheet.getRange('B3').getValue().toString().trim();
  const dataPattern = new RegExp(regexPatternStr, 'g');

  // ▼ PDF → Googleドキュメントへ変換
  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 {
    // ▼ Googleドキュメントの本文を取得
    const doc = DocumentApp.openById(docId);
    const text = doc.getBody().getText();

    // ▼ 正規表現でコード抽出
    const matchedCodes = [...new Set(text.match(dataPattern) || [])];

    // ▼ 比較データシートの取得
    const dataSheet = ss.getSheetByName(dataSheetName);
    if (!dataSheet) throw new Error(`比較用データシート「${dataSheetName}」が見つかりません`);
    const allData = dataSheet.getDataRange().getValues();
    const headers = allData[0];
    const rows = allData.slice(1);
    const matchedRows = [];

    // ▼ A列と一致する行を収集
    // matchedCodes をすべて大文字にしてセット化
    const matchedCodeSet = new Set(matchedCodes.map(c => c.toString().toUpperCase()));
    // 比較時にも大文字にして比較
    rows.forEach(row => {
      const code = row[0]?.toString().trim().toUpperCase();
      if (matchedCodeSet.has(code)) {
        matchedRows.push(row);
      }
    });
    
    // ▼ 出力先シートを準備・出力
    let outputSheet = ss.getSheetByName(outputSheetName);
    if (!outputSheet) {
      outputSheet = ss.insertSheet(outputSheetName);
    } else {
      outputSheet.clear();
    }

    // ▼ ヘッダー行の出力
    outputSheet.getRange(1, 1, 1, headers.length).setValues([headers]);

    // ▼ 一致データの出力
    if (matchedRows.length > 0) {
      outputSheet.getRange(2, 1, matchedRows.length, headers.length).setValues(matchedRows);
    } else {
      outputSheet.getRange(2, 1).setValue('一致なし');
    }

  } finally {
    // ▼ 一時Googleドキュメントをゴミ箱へ
    DriveApp.getFileById(docId).setTrashed(true);
    Logger.log('変換ドキュメントをゴミ箱に移動しました: ' + docId);
  }
}

ボタンの配置

Googleスプレッドシート上にボタンを配置して、[拡張機能] > [Apps Script] で作成したGASコードを実行できるようにします。

メニューの [挿入] > [図形描画] > [図形] を選び、お好きな図形を挿入します。

図形挿入

適宜、「実行」などの文字を入れたら、「保存して閉じる」とし、図形がシートに表示されます。

挿入図形

図形をクリックすると、右上に [縦の3点] が現れるので、それをクリックして、[スクリプトを割り当て] を選択します。

ボタンにスクリプト

表示されたダイアログに、実行したい関数名(今回は convertPdfToGoogleDoc)を入力し、[OK]をクリックします。

スクリプト名入力

[実行]ボタンを押すと、スクリプトが実行されます。

結果表示

コメント

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