Сценарий для загрузки ряда ячеек в листе Google в формате PDF на локальный компьютер и другие сценарии автоматизации? - PullRequest
0 голосов
/ 06 ноября 2019

Я сделал формат счета на g листе, как показано ниже: enter image description here

В ячейке B8: C8 (ниже Invoice To) есть раскрывающийся список, который получает данные излист клиента.

Что требуется?

  1. Для создания PDF выбранных ячеек. Позже я хочу добавить некоторые кнопки и назначить им макросы / сценарии, и действие g g print напечатает все на листе. Поэтому нужно печатать только раздел счета (диапазон-A1: G46). Имя листа будет именем клиента + Дата счета-фактуры (F8).

Я использовал некоторый скрипт из стека над потоком, но они добавляют поля. То, что я хочу, - это полный PDF-файл, который я могу получить, если использую кнопку печати (ctrl + p).

Сохранение данных счета-фактуры на листе «Счет-фактура» для отслеживания счета-фактуры и платежей по ним. Это также достигается.

Я могу добиться этого, записав макрос с использованием относительных ссылок.

    function Untitledmacro1() {
  var spreadsheet = SpreadsheetApp.getActive();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
  spreadsheet.getRange('A1').activate();  
  spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();  
  spreadsheet.getCurrentCell().offset(1, 0).activate();
  spreadsheet.getCurrentCell().setFormulaR1C1('=R[-1]C[0]+1');

  spreadsheet.getCurrentCell().offset(0, 1).activate();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
  spreadsheet.getRange('Invoice!E8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

  spreadsheet.getCurrentCell().offset(0, 1).activate();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
  spreadsheet.getRange('Invoice!F8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

  spreadsheet.getCurrentCell().offset(0, 1).activate();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
  spreadsheet.getRange('Invoice!B8:C8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

  spreadsheet.getCurrentCell().offset(0, 2).activate();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
  spreadsheet.getRange('Invoice!F16').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};

enter image description here

После сохранения данных счета-фактуры и создания файла PDF с определенным диапазоном ячеек я хочу очистить данные в определенных полях. Это также достигается.
function clearRange() {
  //replace 'Sheet1' with your actual sheet name
  var sheet = SpreadsheetApp.getActive().getSheetByName('Invoice');

  sheet.getRange('B8:C8').clearContent(); // client name

  sheet.getRange('C12:F15').clearContent(); // Invoice items - description, date/period, amount
}
Добавьте 1 номер к номеру счета. Формат номера счета-фактуры соответствует сегодняшней дате + текущий месяц + номер счета-фактуры / год (например, 06111/1920). Поэтому нам нужно добавить от 1 до 5 символа для следующего счета.

Я использовал приведенную ниже формулу и добился этого:

=CONCATENATE(0, DAY(F8),MONTH(F8), COUNTA('Invoice Register'!B2:B99)+1,"/",21920)

Но хотел бы сделать сценарийдля этого также.

По сути, я создал инструмент выставления счетов-фактур в Excel, используя VBA, и теперь самая большая проблема заключается в том, что всякий раз, когда я экспортирую PDF из Excel, он показывает белые поля справа, независимо от устранения неполадок. enter image description here

Полагаю, кнопки очевидны, и всякий раз, когда я нажимаю «Новый счет», номер счета увеличивается на 1.

Извините за длинный постЯ должен был сделать это как можно более понятным, и я совершенно новичок в скриптах приложений Google. Любая помощь очень ценится и спасибо.

1 Ответ

0 голосов
/ 06 ноября 2019

Я создал функцию, которая экспортирует диапазон в pdf без границ.

Имейте в виду, что это не приведет к центрированию данных на странице, поэтому, если у вас есть данные, которые слишком малы, вы выиграли 'я не могу "удалить" пробел.

Вот скрипт:

function downloadRangeToPdf() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A1:E20");

  //Create temporary Spreadsheet
  var tempSpreadsheet = SpreadsheetApp.create("tempSheetInvoiceExport", range.getValues().length, range.getValues()[0].length);
  var tempSheet = tempSpreadsheet.getSheets()[0];
  var tempRange = tempSheet.getRange("A1:E20");

  tempRange.setValues(range.getDisplayValues());
  tempRange.setTextStyles(range.getTextStyles());
  tempRange.setBackgrounds(range.getBackgrounds());
  tempRange.setFontColors(range.getFontColors());
  tempRange.setFontFamilies(range.getFontFamilies());
  tempRange.setFontLines(range.getFontLines());
  tempRange.setFontStyles(range.getFontStyles());
  tempRange.setFontWeights(range.getFontWeights());
  tempRange.setHorizontalAlignments(range.getHorizontalAlignments());
  tempRange.setNumberFormats(range.getNumberFormats());
  tempRange.setTextDirections(range.getTextDirections());
  tempRange.setTextRotations(range.getTextRotations());
  tempRange.setVerticalAlignments(range.getVerticalAlignments());
  tempRange.setWrapStrategies(range.getWrapStrategies());

  SpreadsheetApp.flush(); //Force changes to be written before proceeding.

  //Generate Download As PDF Link

  var url = 'https://docs.google.com/spreadsheets/d/{ID}/export?'.replace('{ID}', tempSpreadsheet.getId());
  var exportOptions = 'exportFormat=pdf&format=pdf' + // export as pdf / csv / xls / xlsx
    '&size=letter' + // paper size legal / letter / A4
    '&portrait=true' + // orientation, false for landscape
    '&fitw=true&source=labnol' + // fit to page width, false for actual size
    '&sheetnames=false&printtitle=false' + // hide optional headers and footers
    '&pagenumbers=false&gridlines=false' + // hide page numbers and gridlines
    '&fzr=false' + // do not repeat row headers (frozen rows) on each 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=false' + //true/false
    '&gid=' + tempSheet.getSheetId(); // the sheet's Id
  var token = ScriptApp.getOAuthToken();

  var blob = UrlFetchApp.fetch(url + exportOptions, {
    headers: {
                               Authorization: 'Bearer '+token
    }
  }).getBlob().setName(tempSpreadsheet.getName()+".pdf");

  var pdfFile = DriveApp.createFile(blob);

  var downloadLink = HtmlService
    .createHtmlOutput('<p>Download your file <a href="' + pdfFile.getUrl() + '" target="_blank">here</a>.</p>')
    .setWidth(200)
    .setHeight(100);

  SpreadsheetApp.getUi().showModalDialog(downloadLink, "Download PDF");

  DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true); //Place temporary sheet on trash

}

Я использую параметры urlParameters, описанные в этот ответ , чтобы создатьэкспортируйте, затем установите его в файл диска, чтобы вы могли загрузить его позже.

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

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