NotebookLMソース更新工数対策としてGASを使ってPDFをOCR処理経由でDocsに変換する

NotebookLMソース更新工数対策としてGASを使ってPDFをOCR処理経由でDocsに変換する

NotebookLMのソース更新工数削減にはPDF直インポートではなくDocsの同期反映が効果的です。そこで、GASを使ってPDFをDocsに変換して、同期反映を定期実行するだけで対応可能になるように試してみました。
Clock Icon2025.03.24

NotebookLMのソースとしてPDFを使用している場合、Docsへの変換することにより更新作業が大幅に簡略化できます。ただし、その変換プロセスには課題が多くでてくるはずです。

Google DriveにPDFを配置し、Google Apps Scriptを使ってDocsに変換すれば、NotebookLMの同期メニューで簡単に更新できます。ただし、この変換処理では適切なオプションを指定しないとエラーが発生します。

実際に検証を行い、正常に変換できるようになったオプションについて紹介します。

Geminiに変換処理を質問する

Geminiに質問すると、以下のような処理コードが解として提示されることが多いです。

gasでpdfをdocsに変換する

function convertPdfToDocs(pdfFileId, docName) {
  try {
    // PDFファイルを取得
    var pdfFile = DriveApp.getFileById(pdfFileId);

    // PDFをGoogleドキュメントに変換
    var docFile = pdfFile.getBlob().convertTo(MimeType.GOOGLE_DOCS);

    // Googleドキュメントの名前を変更
    docFile.setName(docName);

    Logger.log('PDFをGoogleドキュメントに変換しました: ' + docFile.getId());
    return docFile.getId();

  } catch (e) {
    Logger.log('エラー: ' + e);
    return null;
  }
}

// 例: ファイルID "YOUR_PDF_FILE_ID" のPDFを変換
function testConvertPdfToDocs() {
  var pdfFileId = 'YOUR_PDF_FILE_ID'; // 実際のPDFファイルIDに置き換えてください
  var docName = 'Converted Document';
  var docId = convertPdfToDocs(pdfFileId, docName);
  if (docId) {
    Logger.log('変換されたGoogleドキュメントのID: ' + docId);
  }
}

残念ながら、このコードは機能しません。convertToメソッドが非推奨(deprecated)となっているためです。

動作が期待できるのはDrive.Files.copyを使う手続きとなります。

convertToを使わないよう指示するとDrive.Files.copyを使用したコードに変更されます。また、サービスにDriveを追加する必要があります。

スクリーンショット 2025-03-24 19.40.39

ただし、実際に呼び出すサービスはv2です。追加したサービスのDriveをクリックして変更します。

スクリーンショット 2025-03-24 19.40.55

function pdfToDocsWithBuiltInOCR(fileId, docName) {
  try {
    const pdfFile = DriveApp.getFileById(fileId);
    const metadata = { title: docName };
    const options = {
      ocr: true,
      fileId: fileId,
    };
    const docsFile = Drive.Files.copy(metadata, pdfFile.getId(), options);
    const docs = DocumentApp.openById(docsFile.getId());
    Logger.log('PDFをDocsに変換しました: ' + docs.getUrl());
  } catch (e) {
    Logger.log('エラー: ' + e);
  }
}

function testPdfToDocsWithBuiltInOCR() {
  const fileId = 'YOUR_PDF_FILE_ID'; // 実際のPDFファイルIDに置き換えてください
  const docName = 'Converted Docs';
  pdfToDocsWithBuiltInOCR(fileId, docName);
}

しかしながら、このコードも正しく動作しません。重要なのはmetadataoptionの設定です。

PDFからDocに変換可能にする引数指定

metadataで親ディレクトリを指定し、optionsではAPIが参照するフィールドとチームドライブの有効化フラグを設定します。

const metadata = { title: docName, parents: [{id: "............."}]};
const options = {
  ocr: true,
  ocrLanguage: "ja",
  fields: "id,title,parents",
  supportsTeamDrives: true, 
};
const docsFile = Drive.Files.copy(metadata, fileId, options);

これでOCR処理を経由したPDFからDocsへの変換が可能となります。以下に、実装したコードを示します。

function pdfToDocsWithBuiltInOCR(fileId, docName) {
  try {
    const metadata = { title: docName, parents: [{id: "........"}]};
    const options = {
      ocr: true,
      ocrLanguage: "ja",
      fields: "id,title,parents",
      supportsTeamDrives: true, 
    };
    const docsFile = Drive.Files.copy(metadata, fileId, options);
    const docs = DocumentApp.openById(docsFile.getId());
    Logger.log('PDFをDocsに変換しました: ' + docs.getUrl());
  } catch (e) {
    Logger.log('エラー: ' + e);
  }
}

function testPdfToDocsWithBuiltInOCR() {
  const fileId = '...........'; // 実際のPDFファイルIDに置き換えてください
  const docName = 'Converted Docs';
  pdfToDocsWithBuiltInOCR(fileId, docName);
}

スクリーンショット 2025-03-24 19.35.51

注意点

PDFファイルのヘッダーやフッターは、Docsに変換すると通常の本文として扱われます。

目次のフォーマットと構造は変換時に通常失われてしまいます。

あとがき

GeminiのAPIコードのサンプルは、必要なパーミッション設定を含んでいないことが多いです。APIから「deprecated」ではなく「Call Error」が返された場合は、公式ドキュメントやFAQを参照して、適切なオプション設定を確認しましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.