
NotebookLMソース更新工数対策としてGASを使ってPDFをOCR処理経由でDocsに変換する
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を追加する必要があります。
ただし、実際に呼び出すサービスはv2です。追加したサービスのDriveをクリックして変更します。
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);
}
しかしながら、このコードも正しく動作しません。重要なのはmetadata
とoption
の設定です。
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);
}
注意点
PDFファイルのヘッダーやフッターは、Docsに変換すると通常の本文として扱われます。
目次のフォーマットと構造は変換時に通常失われてしまいます。
あとがき
GeminiのAPIコードのサンプルは、必要なパーミッション設定を含んでいないことが多いです。APIから「deprecated」ではなく「Call Error」が返された場合は、公式ドキュメントやFAQを参照して、適切なオプション設定を確認しましょう。