0

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

function emailPDF() { 
    SpreadsheetApp.flush(); 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheets = ss.getSheets(); 
    var url = ss.getUrl().replace(/edit$/, ''); 

    //additional parameters for exporting the sheet as a pdf 
    var url_ext = 'export?exportFormat=pdf&format=pdf' + //export as pdf 
     '&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 
     '&gridlines=false' + //false = hide gridlines 
     '&fzr=false' + //do not repeat row headers (frozen rows) on each page 
     '&gid='; //leave ID empty for now, this will be populated in the FOR loop 

    var token = ScriptApp.getOAuthToken(); 

    //make an empty array to hold your fetched blobs 
    var blobs = []; 

    //.fetch is called for each sheet, the response is stored in var blobs[] 
    for (var i = 0; i < sheets.length; i++) { 
     var sheetname = sheets[i].getName(); 

     //if the sheet is one that you don't want to process, 
     //continue' tells the for loop to skip this iteration of the loop 
     if (sheetname == "Dropdown Data") 
      continue; 
     if (sheetname == "Data Log") 
      continue; 

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

     //grab the blob for the sheet 
     var response = UrlFetchApp.fetch(url + url_ext + sheets[i].getSheetId(), options); 

     //convert the response to a blob and store in our array 
     blobs.push(response.getBlob().setName(sheets[i].getName() + '.pdf')); 
     var array_blob = response.getBlob().setName(sheets[i].getName() + '.pdf'); 
    } 

    //Email Evaulation Details 
    var chtm_name = ss.getRange('D5').getValue(); 
    var evaluated_by = ss.getRange('D6').getValue(); 
    var email_to = ss.getRange('E5').getValue(); 

    // send email 
    var subject = "Customer Happiness Audit Form" 
    var message = "Hello " + chtm_name + " - Attached is your audit, completed by " + evaluated_by 
    MailApp.sendEmail(email_to, subject, message, { 
     attachments: [array_blob] 
    }); 
} 
+0

планирующих вы на экспорт всей электронной таблицы, как есть? – Rivero

+0

Мне нужен только активный лист. Но ваш скрипт работает намного лучше, чем мой. Последний шаг - экспортировать активный лист, а не всю таблицу. –

ответ

0

Если вам просто нужно экспортировать весь лист в формате PDF, вы можете использовать DriveApp. код будет выглядеть что-то подобное, как это:

function emailPDF() { 
     SpreadsheetApp.flush(); 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     var sheets = ss.getSheets(); 
     var url = ss.getUrl().replace(/edit$/, ''); 

     //Email Evaulation Details 
     var chtm_name = ss.getRange('D5').getValue(); 
     var evaluated_by = ss.getRange('D6').getValue(); 
     var email_to = ss.getRange('E5').getValue(); 

     var pdf = DriveApp.getFileById(ss.getId()).getAs('application/pdf').getBytes(); 
     var attach = {fileName:'ConvertedSpreadsheet.pdf',content:pdf, mimeType:'application/pdf'}; 

     // send email 
     var subject = "Customer Happiness Audit Form"; 
     var message = "Hello " + chtm_name + " - Attached is your audit, completed by " + evaluated_by; 
     MailApp.sendEmail(email_to, subject, message, { 
     attachments: [attach] 
     }); 
    } 

** Чтобы экспортировать файл с одного листа, подход должен быть:

// Create a new Spreadsheet and copy the current sheet into it. 
    var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export"); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var projectname = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet = originalSpreadsheet.getActiveSheet(); 
    sheet.copyTo(newSpreadsheet); 

    // Find and delete the default "Sheet 1", after the copy to avoid triggering an apocalypse 
    newSpreadsheet.getSheetByName('Sheet1').activate(); 
    newSpreadsheet.deleteActiveSheet(); 

    // Create a copy of the new file, as a pdf 
    var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf').getBytes(); 
    var attach = {fileName:'Weekly Status.pdf',content:pdf, mimeType:'application/pdf'}; 

    // Send the freshly constructed email 
    MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]}); 

    // Delete the wasted sheet we created, so our Drive stays tidy. 
    DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true); 
+0

Hey Rivero, Спасибо за этот скрипт. Он отлично работает, однако мне нужен только активный лист, а не все листы. Как это могло сработать? –

+0

Если это так, нам нужно взять лист, который вы хотите экспортировать, создать новый файл с этим единственным листом, экспортировать этот файл и удалить. Отредактировал мой предыдущий ответ, чтобы отобразить это. – Rivero

+0

Вот и все! Огромное спасибо. Я все еще пытаюсь понять, почему мой предыдущий скрипт не работал. Большое спасибо! –

Смежные вопросы