Script GAS Spreadsheet - создание и загрузка PDF, сохраненного на диске

Добрый день, я создал функцию для сохранения ранее отформатированного листа на диске, мне удалось сохранить его в выбранной папке на диске, кроме того, я также могу отправить этот файл * .pdf на зарегистрированную почту в ячейке, что Все, что мне нужно, это иметь возможность открывать в HTML с помощью Custom Dialog или в любом случае просто скачать этот * .pdf файл. Код выглядит следующим образом:

function CrearPDF(){
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('LP con Seguros'), true);
var sheet = spreadsheet.getActiveSheet();
var fecha = Utilities.formatDate(new Date(), "GMT-5", "dd/MM/yyyy HH:mm:ss");//Captura de la fecha de acuerdo a la zona horaria
var dni = spreadsheet.getRange('\'LP con Seguros\'!B1').getValues();
var nrocuenta = spreadsheet.getRange('\'LP con Seguros\'!C6').getValues();
var correo = spreadsheet.getRange('\'LP con Seguros\'!K13').getValues();
var valRegisSimul=spreadsheet.getRange('\'LP con Seguros\'!P10').getValues();
var nombrePDF = valRegisSimul + " de LP DNI "+dni+" " +fecha+".pdf";

//var r1, c1, r2, c2;
var libroActual = SpreadsheetApp.getActive();
var nombreHoja = libroActual.getActiveSheet().getName();
var gid = libroActual.getActiveSheet().getSheetId();
var ssID = libroActual.getId();
var url = "https://docs.google.com/spreadsheets/d/"+ssID+"/export"+
                                                        "?format=pdf&"+
                                                        "size=a4&"+
                                                        "portrait=true&"+
                                                        "scale=4&"+
                                                        //"top_margin=0.40&"+
                                                        //"bottom_margin=0.40&"+
                                                        //"left_margin=0.40&"+
                                                        //"right_margin=0.40&"+
                                                        "gridlines=false&"+
                                                        "printnotes=false&"+
                                                        //"pageorder=2&"+
                                                        "horizontal_alignment=CENTER&"+
                                                        "vertical_alignment=TOP&"+
                                                        "printtitle=false&"+
                                                        "sheetnames=false&"+
                                                        "fzr=false&"+
                                                        "fzc=false&"+
                                                        "attachment=false&"+
                                                        "gid=" + gid + "&"+
                                                        "r1=" + 0 + "&"+
                                                        "c1=" + 0 + "&"+
                                                        "r2=" + 62 + "&"+
                                                        "c2=" + 8;

var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
var response = UrlFetchApp.fetch(url, params).getBlob();

// Creamos un fichero con el Blob anterior y le cambiamos el nombre 
//var newPdfFile = DriveApp.createFile(response);
//newPdfFile.setName(nombrePDF);//localiza tu pdf en tu Drive :)
//}

var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' +  token } });
var pdf = docurl.getBlob().setName(nombrePDF).getAs('application/pdf');

var folders = DriveApp.getRootFolder().getFolders(); // En esta variable se almacenan solo los carpetas del directorio raiz
var nombrecarpeta = "DNIs de LP y Simulaciones";
  if(folders.hasNext() == false)//Para cuando no hay carpetas o folder aún en el Drive
  {
    var NewFolder = DriveApp.createFolder(nombrecarpeta);
    NewFolder.createFile(pdf);
  }
  else //En el caso de que sí haya carpetas o folder en el Drive, los recorre hasta encontrar el nombre "nombrecarpeta" sino lo encuentra la creará y ahí guarda el archivo
  {
    while (folders.hasNext())
    {
      var folder = folders.next();
      if(folder.getName() == nombrecarpeta)// en el caso de que exista una carpeta con el nombre terminamos la iteracion de las carpetas
    {
      var folderid = folder.getId();
      var Transfolder = DriveApp.getFolderById(folderid);
      Transfolder.createFile(pdf);
      break;
    }
    else 
    {// Creamos la carpeta en el caso de que aún no exista y guardamos el archivo en la nueva carpeta
      var NewFolder = DriveApp.createFolder(nombrecarpeta);
      NewFolder.createFile(pdf);
      break;
    }
   }   
  }

spreadsheet.setActiveSheet(spreadsheet.getSheetByName('LP con Seguros'), true);
var sheet = spreadsheet.getActiveSheet();

  //Obtiene el nombre del archivo PDF recién creado, así como su contenido
   var archivo = docurl.getBlob().getAs('application/pdf').getBytes(); // sin la opción getBytes obtendríamos un archivo sin contenido
   var attach = {fileName:nombrePDF,content:archivo, mimeType:'application/pdf'};

   var subject = valRegisSimul + ' de Crédito Efectivo DNI ' + dni + ' ' + fecha;

   var html = '<body>' + '<strong>' + ' <p>Estimado(a)' + '</strong>' + '</p>' + 
      '<p>A continuación encontrará adjunto el archivo del plan de pagos de su Crédito Efectivo, recuerde siempre realizar los abonos al número de cuenta del préstamo.</p>' + 
      '<p style="text-align: left;">==> El número de cuenta del Crédito Efectivo a donde se deben hacer los abonos es: ' + '<strong>' + nrocuenta + '</strong>' + '</p>' +
      '<p></p>'+
      '<p></p>'+'<p>'+'<strong>' + 'David Ezequiel Salcedo Pablo ' + '</strong>' + '</p>'+
      '<p>'+'<strong>' + 'Asesor de Servicios - Financiera Oh!' + '</strong>' + '</p>'+
      '<p>'+'<strong>' + 'Celular: 976020013' + '</strong>' + '</p>'

  //Muestra un Popup preguntando si deseas enviar la transferencia por correo  
   SpreadsheetApp.getUi()
  var ui = SpreadsheetApp.getUi();



  var response = ui.alert('Se completó el registro correctamente, ¿Desea enviar el plan de pagos al correo registrado: '+ correo + ' ?' + '\n\n' + 'Caso contrario, el archivo ' + nombrePDF + ' sólo se guardará en la carpeta ' + nombrecarpeta + ' de Drive', ui.ButtonSet.YES_NO);
  // Si la respuesta es si, mandará el correo, de lo contrario termina el programa
  if (response == ui.Button.YES)
  {
      GmailApp.sendEmail(correo, subject, "Cuerpo", {htmlBody:html, attachments:[attach]});
      SpreadsheetApp.getUi().alert('Se envió correctamente el plan de pagos al correo '+ correo + '.' + '\n\n' + 'Mencione regreso por seguros y número de cuenta del Crédito efectivo');

     }else
     {
       //Solo por referencia
       Logger.log('El archivo '+ nombrePDF + ' quedó guardado en la carpeta ' + nombrecarpeta + ' de Drive');
     };
  }

Идея состоит в том, что в конце кода добавляется функция, которая позволяет мне загружать указанный PDF-файл на ПК, мобильный телефон или планшет или в любом случае, как я уже говорил, чтобы иметь возможность открывать этот PDF в пользовательском диалоге через сайт Google. Я заранее благодарю вас за ответы, которые вы можете получить.

1
задан 29.11.2019, 01:21
2 ответа

Вызов .createFile() возвращает File. С этим файлом, ты можешь называть .getDownloadUrl() и делать то, что ты хочешь в Dialog.

var file = NewFolder.createFile(pdf);
Logger.log(file.getDownloadUrl());

Пожалуйста avГ-same, если entendГ - зло и это не то, что ты искал.


TambiГ©n я хочу предупредить, что Ваш cГіdigo он может улучшаться muchГ-simo. Например, у тебя есть много вызовов, удвоенных как

var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('LP con Seguros'), true);
var sheet = spreadsheet.getActiveSheet();
// ...
var libroActual = SpreadsheetApp.getActive();
var nombreHoja = libroActual.getActiveSheet().getName();
var gid = libroActual.getActiveSheet().getSheetId();

, что это podrГ-схвати меняться asГ -

var spreadsheet = SpreadsheetApp.getActive();
var nombreHoja = 'LP con Seguros';
var sheet = spreadsheet.getSheetByName(nombreHoja).activate();
var gid = sheet.getSheetId()

Я Предлагаю, что уже, когда ты добился, чтобы оно функционировало совсем, как ты хочешь, который ты помещаешь mГЎs время проверить немножко cГіmo, ты можешь улучшать cГіdigo.

1
ответ дан 01.12.2019, 10:39
  • 1
    Привет, спасибо за ответ! Apliqué твои подсказки и logré что có я говорю, что он продолжил прокручивать изображение в окне, но мне не может удаваться загрузить PDF, я хотел бы, чем в сообщении enví или Почты electró nico меня вытекли ссылка или botó n, что сказал, что я загрузил PDF. SpreadsheetApp.getUi() var ui = SpreadsheetApp.getUi(); var response = ui.alert('Se completó el registro correctamente, ¿Desea enviar el plan de pagos al correo registrado: '+ correo + ' ?' + '\n\n' + 'Caso contrario, el archivo ' + nombrePDF + ' sólo se guardará en la carpeta ' + nombrecarpeta + ' de Drive', ui.ButtonSet.YES_NO); – DxSystem2 29.11.2019, 04:15
  • 2
    @DxSystem2 Cuá l - проблема точно? Дело в том, что у тебя нет botó n, чтобы загружаться? В этом случае, он, потому что ты должен писать HTML для enseñ барбарис. – Diego 29.11.2019, 04:46
  • 3
    @Diego, что я желаю, состоит в том, чтобы добавлять lí nea в сообщение Посылания почты, которую он говорил бы: completó реестр правильно, ' ¿ Захоти послать план платежей на зарегистрированную почту: ' + почта + '? Если só он это желает хочет загрузить файл, клик aquí ' – DxSystem2 29.11.2019, 04:55
  • 4
    @DxSystem2 ты Можешь включать соединение в .prompt(), но идет появляться как текст и не соединение, что ты он можешь кликать. Если ты это хочешь, tendrá s, что создавать что-то в HTML и показывать это с showModalDialog(). Но это tambié n идет требовать несколько изменений в có я говорю. – Diego 29.11.2019, 09:52
  • 5
    Привет @Diego, с указаниями @Rubé n, я сделал diá ologo модальный и quedó así: var file = NewFolder.createFile(pdf); var url = file.getDownloadUrl(); var html = '<a href=" + url + " target="_blank">Para descargar el PDF con la simulación de pagos, haz clic aquí</a>'; var userInterface = HtmlService.createHtmlOutput(html); var title = "Descargar PDF de Google Drive"; SpreadsheetApp.getUi().showModalDialog(userInterface, title);, Но дав клик, меня производит Ошибка 400 (Нот Фоунд)!! 1 – DxSystem2 29.11.2019, 23:06

ЗАМЕТЬ: В cГіdigo вопроса включают некоторые diГЎlogos и в комментарии в начальный ответ упоминать о том, что хочет включиться ссылка, чтобы загружать произведенный файл.

, Чтобы включать ссылку, (текст cliqueable) в одном diГЎlogo настроенный ("custom dialog") должны использовать HTML Service , потому что mГ©todo alert sГіlo показывает плоский текст и предопределенные кнопки (SГ, - Не, Соглашаться, Отменять), что были показаны.

Есть несколько способов использовать HTML Service, себе может помещать HTML в файл тип html или могут генерал объект HTMLOutput с основанием String.

Ввиду того, что url, чтобы загружаться, - изменчивый, quizГЎs mГЎs простой состоял в том, чтобы делать HTMLOutput с String, как ты это сделал с сообщением, которое нужно посылать по почте, потому что, если ты предпочитаешь использовать файл deberГЎs использовать шаблоны и scriptlets, что подразумевает больше вещей из-за того, что изучает.

В continuaciГіn очень простой пример cГіmo показывать один dГ-alogo модальный со ссылкой

function mostrarEnlace() {
  var url = 'https://es.stackoverflow.com';
  var html = '<a href=" + url + " target="_blank">Stack Overflow en español</a>';
  var userInterface = HtmlService.createHtmlOutput(html);
  var title = "Mostrar enlace";
  SpreadsheetApp.getUi().showModalDialog(userInterface, title);
}

Снабжает ссылками

0
ответ дан 01.12.2019, 10:39
  • 1
    Большое спасибо, сейчас probaré – DxSystem2 29.11.2019, 22:39
  • 2
    Привет @Rubé n, я сделал diá ologo модальный, поскольку ты поместил меня в пример и quedó así: var file = NewFolder.createFile(pdf); var url = file.getDownloadUrl(); var html = '<a href=" + url + " target="_blank">Para descargar el PDF con la simulación de pagos, haz clic aquí</a>'; var userInterface = HtmlService.createHtmlOutput(html); var title = "Descargar PDF de Google Drive"; SpreadsheetApp.getUi().showModalDialog(userInterface, title);, Но дав клик, меня производит Ошибка 400 (Нот Фоунд)!! 1, ¿ какая-то идея? PD. Не sé có mo реализовывать разрывы pá gina :( – DxSystem2 29.11.2019, 23:07
  • 3
    @DxSystem2 я предлагаю Тебе напечатать новый вопрос, в который ты включал бы пример mГ-nimo проверяемо . – Rubén 30.11.2019, 00:00
  • 4
    @DxSystem2, Относительно которого ты не знаешь có mo реализовывать разрывы pá gina, если ты относишься скачками pá gina в комментариях, не могут. – Rubén 30.11.2019, 00:02