在迭代一组值时导出 PDf

Export PDf while iterating over a set of values

我对使用脚本自动化 sheet 的世界相当陌生,我仍然坚定地处于编写脚本的 'cobble other peoples code together' 阶段。

我在 Google 工作表中有一个时间表,它根据单元格 ('B1') 的内容显示不同部门的概览。我正在尝试通过该单元格迭代值列表,并在每个实例中将结果 sheet 导出为 pdf。

到目前为止我已经开始工作了,我的下一个障碍是让它以横向而不是纵向导出 pdf。我可以看到使用 url 导出的实现,但我没有足够的信心(阅读继续打破一切)将其实现到下面的脚本中。

非常感谢任何帮助!

  function PrintPDF(){
  
  var df = DriveApp.getFolderById("folderID");
  var arr = new Array();
  var files = df.getFiles();
  while( files.hasNext() ) {
    var f = files.next();
    arr.push( [ [ f.getId() ] , [ f.getLastUpdated() ] ] );
  }
  arr.sort( sortFunction );

  function sortFunction( a , b ) {
  var aDate = new Date(a[1]);
  var bDate = new Date(b[1]);
  if ( aDate === bDate ) return 0;
  else if ( aDate < bDate ) return 1;
  else return -1;
};
  
  for( var i=0 ; i<arr.length ; i++ )
    DriveApp.getFileById( arr[i][0] ).setTrashed( true );


//Create array of show codes
var Dss = SpreadsheetApp.getActive().getSheetByName('Value Lists')
var Tss = SpreadsheetApp.getActive().getSheetByName('PrintSheet')
var Shows = Dss.getRange('K3:K11').getValues()
var Count = Shows.length
var Code = Tss.getRange('B1')

Logger.log(Count)
Logger.log(Shows)

for (i=0;i<Count;i++){

Code.setValue(Shows[i])
HideBlankRows ()
  const folderName = `foldername`;
  var ss =SpreadsheetApp.getActiveSpreadsheet()
  var name = "Department - "+ss.getRange('B1').getValue()
  Logger.log(name)

  DriveApp.getFoldersByName(folderName)
    .next()
    .createFile(ss
                  .getBlob()
                  .getAs(`application/pdf`)
                  .setName(name)
    );  
}
Code.setValue('')
}

function HideBlankRows() {
  var ss = SpreadsheetApp.getActive();
  var sheets = ss.getSheets(); // array of all sheet objects in ss
  var numSheets = ss.getNumSheets(); // count of sheets
for(sheet in sheets) {
  if(sheets[sheet].getSheetName() == "AA") continue;
//show all the rows
  sheets[sheet].showRows(1, sheets[sheet].getMaxRows());

//get data from column A
  var data = sheets[sheet].getRange('A:A').getValues();
Logger.log(data)
//iterate over all rows
  for(var i=0; i< data.length; i++){
//compare column, if no, then hide row
    if(data[i][0] == 'Yes'){
      sheets[sheet].hideRows(i+1);
  }
 }
 }
}

我觉得你的代码有点神秘。我不明白为什么你需要 arr 数组,如果你无处使用它。等等

但无论如何。假设代码工作正常,您只需要保存一个横向的 PDF 文件。在这种情况下,您需要在代码中替换这些行:

  DriveApp.getFoldersByName(folderName)
    .next()
    .createFile(ss
                  .getBlob()
                  .getAs(`application/pdf`)
                  .setName(name)
    );  

有了这个:

savePDFs(name);

并在脚本末尾添加函数 savePDFs():

function savePDFs(name) {
  SpreadsheetApp.flush();

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var url = ss.getUrl();

  //remove the trailing 'edit' from the url
  url = url.replace(/edit$/, '');

  //additional parameters for exporting the sheet as a pdf
  var url_ext = 'export?exportFormat=pdf&format=pdf' + //export as pdf
    //below parameters are optional...
    '&size=a4' +         //paper size
    '&portrait=false' +  //orientation, false for landscape, true for portrait
    '&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
    '&gid=' + sheet.getSheetId(); //the sheet's Id

  var token = ScriptApp.getOAuthToken();

  var response = UrlFetchApp.fetch(url + url_ext, {
    headers: { 'Authorization': 'Bearer ' + token }
  });

  var blob = response.getBlob().setName(name + '.pdf');

  DriveApp.createFile(blob);
}

此函数取自此处: