Экспортируйте лист Google в качестве параметров настройки PDF, таких как поля - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь экспортировать указанный лист c в моей электронной таблице в файл PDF, для файла будет задано имя на основе значений ячейки, и я хочу установить параметры экспорта, чтобы все поля были установлены как 0

Я получил приведенный ниже код онлайн и изменил его в соответствии со своими потребностями, но при экспорте не выводится имя файла, как мне хотелось бы, и он не устанавливает для полей экспорта значение 0 и подходит для страницы:

Кто-нибудь получил какие-либо идеи о том, как я могу сделать это с помощью скрипта приложений (если у кого-то есть лучший скрипт, я готов попробовать это :))

function exportPDF() { 
  var sourceSpreadsheet = SpreadsheetApp.getActive();

  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName("Agreement");

  var ss = SpreadsheetApp.getActive();
  var sh = ss.getSheetByName("Agreement");
  var sheet = ss.getSheetByName("Input");
  var name = sheet.getRange("C3").getValue();
  var company = sheet.getRange("C4").getValue();
  var order = sheet.getRange("C11").getValue();
  var gAcc = sheet.getRange("C12").getValue();
  var pdfName = "Agreement_" & name;

  if(company != "")
  {
    pdfName = pdfName + "_" & company & "_" & order & "_" & gAcc;
  }
  else
  {
    pdfName = pdfName + "_" & order & "_" & gAcc;
  }

  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

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

  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];

  var sourceRange = sourceSheet.getRange("A1:I57");
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

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

  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

1 Ответ

1 голос
/ 12 марта 2020

Имя файла достигается путем перестановки кода и правильной конкатенации некоторых строк.

Я изменил ваш скрипт в нескольких местах, как показано ниже:

function exportPDF() { 

  var sourceSpreadsheet = SpreadsheetApp.getActive();

  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName("Agreement");

  var name = sourceSheet.getRange("C3").getValue();
  var company = sourceSheet.getRange("C4").getValue();
  var order = sourceSheet.getRange("C11").getValue();
  var gAcc = sourceSheet.getRange("C12").getValue();
  var pdfName = "Agreement_" + name;

  if(company != "")
  {
    pdfName = pdfName + "_" + company + "_" + order + "_" + gAcc;
  }
  else
  {
    pdfName = pdfName + "_" + order + "_" + gAcc;
  }

  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  var folder;
  if (parents.hasNext()) {
     folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy(pdfName, folder))

  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];

  var sourceRange = sourceSheet.getDataRange();
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.setActiveSelection(sourceRange.getA1Notation());
  destRange.setValues(sourcevalues);

  var theBlob = getBlob();
  var newFile = folder.createFile(theBlob).setName(pdfName);

  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

До этого момента у вас есть создал PDF-файл с данными, которые вы хотите, и имя, которое вы хотите. Но поля все еще не те, которые вы хотите.


Установка полей PDF:

Получите BLOB-объект, используя UrlFetchApp

function getBlob(){
  var url = 'https://docs.google.com/spreadsheets/d/';
  var id = '<YOUR-FILE-ID>';
  var url_ext = '/export?'
  +'format=pdf'
  +'&size=a4'                      //A3/A4/A5/B4/B5/letter/tabloid/legal/statement/executive/folio
  +'&portrait=true'                //true= Potrait / false= Landscape
  +'&scale=1'                      //1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
  +'&top_margin=0.00'              //All four margins must be set!
  +'&bottom_margin=0.00'           //All four margins must be set!
  +'&left_margin=0.00'             //All four margins must be set!
  +'&right_margin=0.00'            //All four margins must be set!
  +'&gridlines=true'               //true/false
  +'&printnotes=false'             //true/false
  +'&pageorder=2'                  //1= Down, then over / 2= Over, then down
  +'&horizontal_alignment=LEFT'  //LEFT/CENTER/RIGHT
  +'&vertical_alignment=TOP'       //TOP/MIDDLE/BOTTOM
  +'&printtitle=false'             //true/false
  +'&sheetnames=false'             //true/false
  +'&fzr=false'                    //true/false
  +'&fzc=false'                    //true/false
  +'&attachment=false'
  +'&gid=0';
  // console.log(url+id+url_ext);
  var blob = UrlFetchApp.fetch(url+id+url_ext).getBlob().getAs('application/pdf');
  return blob;
}

Там у тебя есть это. PDF без полей, экспортированных из листа.

Примечание: Чтобы избежать аутентификации при использовании UrlFetchApp, вы можете опубликовать свой лист c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...