Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌应用程序脚本-将电子表格保存到谷歌硬盘上保存的PDF_Pdf_Google Apps Script_Google Sheets - Fatal编程技术网

谷歌应用程序脚本-将电子表格保存到谷歌硬盘上保存的PDF

谷歌应用程序脚本-将电子表格保存到谷歌硬盘上保存的PDF,pdf,google-apps-script,google-sheets,Pdf,Google Apps Script,Google Sheets,我正在尝试将电子表格中的所有表格保存到google drive中,作为一个PDF格式,最终我希望它们也能通过电子邮件发送。我存不下不止一张床单。我试过多种方法。下面的代码是迄今为止我找到的最好的方法。问题是,它只将第一页保存为PDF格式,我不知道如何删除多余的工作表。我看到的所有帖子只想保存一页,我有超过24页需要保存为一个PDF。提前感谢您的帮助 function PDF() { var sheetName = SpreadsheetApp.getActiveSpreadsheet();

我正在尝试将电子表格中的所有表格保存到google drive中,作为一个PDF格式,最终我希望它们也能通过电子邮件发送。我存不下不止一张床单。我试过多种方法。下面的代码是迄今为止我找到的最好的方法。问题是,它只将第一页保存为PDF格式,我不知道如何删除多余的工作表。我看到的所有帖子只想保存一页,我有超过24页需要保存为一个PDF。提前感谢您的帮助

function PDF() {
  var sheetName = SpreadsheetApp.getActiveSpreadsheet();
  var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
  var ss = SpreadsheetApp.openByUrl(
     'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
  var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet

  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  var folder = DriveApp.getFolderById(folderID);

  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  var destSheet = destSpreadsheet.getSheets()[0];

  //repace cell values with text (to avoid broken references) 
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  //save to pdf
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile = folder.createFile(theBlob);

  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

通过使用驱动API,您可以将电子表格转换为包含电子表格中所有工作表的PDF。为了使用它,请在GoogleAPI控制台上启用驱动API,如下所示

在脚本编辑器中,选择资源>云平台项目

在对话框底部,单击GoogleAPI控制台的链接

在控制台中,单击过滤器框并键入API驱动器API的部分名称,然后在看到该名称后单击该名称

在下一个屏幕上,单击启用API

关闭开发者控制台并返回脚本编辑器。在对话框中单击“确定”

我准备了一个从电子表格创建PDF文件的示例脚本。请将此应用于您的脚本

脚本:

关于这个脚本,虽然我确认它可以正常工作,但如果它在您的环境中不工作,请告诉我。如果我误解了你的问题,我很抱歉

增加1:


下面是从google sheet创建PDF文件的函数,以及将新创建的文件移动到为函数参数指定id的文件夹中的函数

function downloadPDF(fileId, folderId) {
  var file = Drive.Files.get(fileId);
  var url = file.exportLinks[MimeType.PDF];

  var options = {
    headers: {
      Authorization:"Bearer " + ScriptApp.getOAuthToken()
    },
    muteHttpExceptions : true 
  }

  var response = UrlFetchApp.fetch(url, options);
  var status = response.getResponseCode();
  var result = response.getContentText();
  if (status != 200) {
    // Get additional error message info, depending on format
    if (result.toUpperCase().indexOf("<HTML") !== -1) {
      var message = strip_tags(result);
    }
    else if (result.indexOf('errors') != -1) {
      message = JSON.parse(result).error.message;
    }
    throw new Error('Error (' + status + ") " + message );
  }

  var doc = response.getBlob();
  var newFileid = DriveApp.createFile(doc).setName(file.title + '.pdf').getId();
  let id = moveFileTo(newFileid, folderId);
 
  return id;
}


function moveFileTo(sourceId, folderId){
  let file = DriveApp.getFileById(sourceId)
  let blob = file.getBlob();
  let id = DriveApp.getFolderById(folderId).createFile(blob).getId();
      file.setTrashed(true)
      return id;
}

我在脚本中的什么地方添加这个?很抱歉我的回答不好。我更新了我的答案并添加了一个脚本修改了您添加的脚本。请检查一下。我试过了,但我一直得到相同的错误,你不能删除文档中的最后一页。第19行,PDF文件StackDismissI我不知道第19行。它出现在我的脚本中吗?不,它没有出现在你的脚本中,也非常感谢你的帮助!
function PDF() {
  var sheetName = SpreadsheetApp.getActiveSpreadsheet();
  var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
  var ss = SpreadsheetApp.openByUrl(
     'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
  var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet

  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  var folder = DriveApp.getFolderById(folderID);

  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  var destSheet = destSpreadsheet.getSheets()[0];

  //repace cell values with text (to avoid broken references) 
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  //save to pdf
//  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
//  var newFile = folder.createFile(theBlob);


  // A sample script was added here.
  var url = "https://www.googleapis.com/drive/v3/files/" + destSpreadsheet.getId() + "/export?mimeType=application/pdf";
  var options = {
      method: "GET",
      headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
      muteHttpExceptions: true
  };
  var response = UrlFetchApp.fetch(url, options).getBlob();
  DriveApp.getFolderById(folderID).createFile(response).setName(pdfName);


  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}
function PDF() {
  var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
  var ss = SpreadsheetApp.openByUrl(
     'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
  var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet
  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var folder = DriveApp.getFolderById(folderID);

  // A sample script was added here.
  var url = "https://www.googleapis.com/drive/v3/files/" + sourceSpreadsheet.getId() + "/export?mimeType=application/pdf";
  var options = {
      method: "GET",
      headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
      muteHttpExceptions: true
  };
  var response = UrlFetchApp.fetch(url, options).getBlob();
  DriveApp.getFolderById(folderID).createFile(response).setName(pdfName);
}
function downloadPDF(fileId, folderId) {
  var file = Drive.Files.get(fileId);
  var url = file.exportLinks[MimeType.PDF];

  var options = {
    headers: {
      Authorization:"Bearer " + ScriptApp.getOAuthToken()
    },
    muteHttpExceptions : true 
  }

  var response = UrlFetchApp.fetch(url, options);
  var status = response.getResponseCode();
  var result = response.getContentText();
  if (status != 200) {
    // Get additional error message info, depending on format
    if (result.toUpperCase().indexOf("<HTML") !== -1) {
      var message = strip_tags(result);
    }
    else if (result.indexOf('errors') != -1) {
      message = JSON.parse(result).error.message;
    }
    throw new Error('Error (' + status + ") " + message );
  }

  var doc = response.getBlob();
  var newFileid = DriveApp.createFile(doc).setName(file.title + '.pdf').getId();
  let id = moveFileTo(newFileid, folderId);
 
  return id;
}


function moveFileTo(sourceId, folderId){
  let file = DriveApp.getFileById(sourceId)
  let blob = file.getBlob();
  let id = DriveApp.getFolderById(folderId).createFile(blob).getId();
      file.setTrashed(true)
      return id;
}