将PDF转换为Google文档,并提取文本以及将原始PDF文件链接到电子表格中

时间:2019-12-09 08:59:50

标签: google-apps-script google-sheets

当我运行脚本以使用OCR将PDF文件转换为Google文档然后将结果填充到Google表格中时,我在获取PDF文件的链接时遇到了一个小问题。

到目前为止,我得到了所创建文件的名称(Google文档)和提取的文本。

我要实现的目标:在第三列,我想获取与创建的Google文档相对应的PDF文件的链接

我尝试将变量pdf包含在推数组中:

worksheet.pageSetup.horizontalCentered = true 
worksheet.pageSetup.verticalCentered = true

但是我为所有文件获得相同的ID。理想情况下,我想获得指向PDF文件的完整链接,不仅要获取ID,还可以避免创建带有以下内容的列:

    var pdf = document.getId();
...
    output.push([name, body, pdf]);

其中C2包含PDF文件的ID。

代码如下:

=CONCATENATE("https://drive.google.com/file/d/",C2)

2 个答案:

答案 0 :(得分:2)

您有不必要的循环,因此您失去了保存PDF URL的机会。我更改了代码的顺序,以向您展示其工作方式。本质上,所有工作都在您遍历PDF的第一个循环内进行。*

function extractTextOnOpen() {
  var folderName = "OCR TESTS";
  var sheetId = "SHEET'S ID HERE";

  //Set up spreadsheet
  var ss = SpreadsheetApp.openById(sheetId);

  // specify the sheet to insert the results  
  var sheet = ss.getSheetByName("Sheet1");

  // Set up the spreadsheet to display the results
  var headers = ["File Name", "Test Paper Scanned", "PDF Link"];
  sheet.getRange("A1:C").clear()
  var output = [headers];

  //Define Project folder
  var folder = DriveApp.getFoldersByName(folderName).next();
  var folderId = folder.getId();

  //Find all PDFs in folder
  var pdfs = folder.getFilesByType("application/pdf");
  while (pdfs.hasNext()) {
    //Convert each PDF to a Google Doc with OCR
    var pdf = pdfs.next();    
    var imageName = pdf.getName();
    var docName = imageName.split("\.")[0];
    var file = {
      title: docName,
      mimeType: "application/pdf"
    };
    var driveFile = Drive.Files.insert(file, pdf, { ocr: true });

    //Store newly-created Google Doc in the same project folder
    var newFile = DriveApp.getFileById(driveFile.id);
    folder.addFile(newFile);
    var rootFolder = DriveApp.getRootFolder();
    rootFolder.removeFile(newFile);

    //Get the Google Doc data
    var doc = DocumentApp.openById(driveFile.id);
    var name = doc.getName();
    var body = doc.getBody().getText();
    output.push([name, body, pdf.getUrl()]);
  }
  //Print to the sheet
  sheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}

在上面的代码中,请注意Drive API返回一个file,因此在后续的.getFileById()调用中使用了它。然后,您可以使用.getUrl().getDownloadUrl()

var driveFile = Drive.Files.insert(file, pdf, { ocr: true });

//Store newly-created Google Doc in the same project folder
var newFile = DriveApp.getFileById(driveFile.id);

此外,您正在使用批次.setValues(),该批次速度更快,但是您将其循环了。我将脚本更新为只在最后一次打印到印张。

* 如果您真的要先经历两个PDF循环,然后再经历Google Docs,那么您需要在第一个循环中将PDF ID映射到Google Doc ID。

答案 1 :(得分:0)

方法getUrl()呢?

示例:

var pdf = document.getUrl();