【问题标题】:Google Appscript Exporting all Sheets as PDF and name it from a specific Cell Value - Save in a specific FolderGoogle Apps 脚本将所有工作表导出为 PDF 并从特定单元格值命名 - 保存在特定文件夹中
【发布时间】:2020-06-30 13:45:50
【问题描述】:

我正在尝试将所有工作表导出为 PDF,从单元格 D5 中获取文件名并将它们保存到 Google 驱动器中的特定文件夹中,但是,我得到了一堆与第一张工作表同名的副本。有什么建议么?还更改了 DriveApp.getRootFolder();对于 getFolderbyName,似乎无法识别实际文件夹,代码中的其他所有内容都可以正常工作。


function savePDFs( optSSId, optSheetId ) {

  var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
  

  var url = ss.getUrl().replace(/edit$/,'');

 
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getFolderbyName('Invoices');
  }
  

  var sheets = ss.getSheets();
  

  for (var i=0; i<sheets.length; i++) {
    var sheet = sheets[i];
    

    if (optSheetId && optSheetId !== sheet.getSheetId()) continue; 
    

    var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
        + '&gid=' + sheet.getSheetId()   //the sheet's Id
        // following parameters are optional...
        + '&size=letter'      // paper size
        + '&portrait=true'    // orientation, false for landscape
        + '&fitw=true'        // fit to width, false for actual size
        + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
        + '&gridlines=false'  // hide gridlines
        + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

    var options = {
      headers: {
        'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
      }
    }

    var response = UrlFetchApp.fetch(url + url_ext, options);
    
    var ss2= SpreadsheetApp.getActiveSpreadsheet();
    
var valor = SpreadsheetApp.getActiveSheet().getRange('D5').getValue()
    
    var blob = response.getBlob().setName(valor + '.pdf');


    folder.createFile(blob);
  }
}

【问题讨论】:

  • 关于I'm getting a bunch of duplicates with the same name as the first sheet. Any suggestions?,可以问一下你的目标细节吗?
  • 当然,将所有工作表导出为 PDF,每个工作表在每个工作表范围 D5 中都有不同的名称
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。我想确认我对您的目标的理解。我认为在您当前的脚本中,只有optSheetId 的工作表被导出为 PDF 文件。您的目标是使用工作表名称到文件名将电子表格中的所有工作表导出为 PDF 文件。我的理解正确吗?
  • 无论如何,感谢您的帮助,脚本循环遍历所有工作表,并将它们中的每一个导出为 PDF 并将它们保存在驱动器中,但我需要脚本将每个 PDF 命名为每张纸的单元格 D5 中的值。
  • 感谢您的回复。根据您的回复,我提出了一个修改后的脚本作为答案。你能确认一下吗?

标签: google-apps-script google-sheets


【解决方案1】:

我相信你的目标如下。

  • 您想将optSheetId 的工作表导出为 PDF 文件。
  • 您希望从每张纸的“D5”单元格中检索值并将其用于 PDF 文件的文件名。
  • 您想将 PDF 文件放到Invoices 的文件夹中。当文件夹不存在时,使用电子表格的同一文件夹。

对于这个,这个答案怎么样?

修改点:

  • DriveApp.getFolderbyName('Invoices')请修改getFolderbyNamegetFoldersByName
  • 为了从每张表的单元格“D5”中检索值,请将var valor = SpreadsheetApp.getActiveSheet().getRange('D5').getValue()修改为var valor = sheet.getRange('D5').getValue();

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

function savePDFs( optSSId, optSheetId ) {
  var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
  var url = ss.getUrl().replace(/edit$/,'');
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  
  var folders = DriveApp.getFoldersByName('Invoices');  // Modified
  var folder = folders.hasNext() ? folders.next() : parents.next();  // Modified

  var sheets = ss.getSheets();
  for (var i=0; i<sheets.length; i++) {
    var sheet = sheets[i];
    if (optSheetId && optSheetId !== sheet.getSheetId()) continue; 
    var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
      + '&gid=' + sheet.getSheetId()   //the sheet's Id
      // following parameters are optional...
      + '&size=letter'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page
    var options = {headers: {'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()}}
    var response = UrlFetchApp.fetch(url + url_ext, options);
    var valor = sheet.getRange('D5').getValue();  // Modified
    var blob = response.getBlob().setName(valor + '.pdf');
    folder.createFile(blob);
  }
}

参考资料:

【讨论】:

  • 完全按预期工作,很好地使用 sheet.getrange,因为前一个在脚本启动时获得了第一个活动工作表,我很感激。
  • @Excelsson 感谢您的回复。我很高兴你的问题得到了解决。通过您的支持,我可以理解您的问题。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多