в Gscript, как конвертировать листы в несколько PDF без тайм-аута - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь настроить журнал успеваемости, я хотел бы пройтись по списку студентов на листе, который имеет различные просмотры для создания отдельного листа оценки. Затем я хотел бы сделать PDF для каждого из студентов. Я продолжаю задавать тайм-аут запросов сервера после примерно 6 студентов. Сообщение об ошибке сообщает «возвращенный код 429».

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

    function PrintReport() {
    SpreadsheetApp.getActiveSpreadsheet().toast('Writing the reports.','Printing Reports');

        var email = Session.getActiveUser().getEmail();
        var TodayDate = new Date();
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var ClassName = ss.getName()
        var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());
        var StudentList = ss.getSheetByName('Mark Sheet');
        var StudentCount = StudentList.getRange("A2").getValue();
        var SLData = StudentList.getRange(7,1,StudentCount).getValues();
        var ReportSheet = ss.getSheetByName('Student Report');
        var url_ext = 'exportFormat=pdf&format=pdf'        // export as pdf / csv / xls / xlsx
            + '&size=letter'                       // paper size legal / letter / A4
            + '&portrait=false'                    // orientation, false for landscape
            + '&fitw=true&source=labnol'           // fit to page width, false for actual size
            + '&sheetnames=False&printtitle=True' // 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
            + '&gid=';                             // the sheet's Id
     var token = ScriptApp.getOAuthToken();
      var blobs = [];
      var sheetID = ss.getSheetByName('Student Report').getSheetId();
      var url_base = ss.getUrl().replace(/edit/,'');


    for (var i = 0; i < StudentCount; i++){
          ReportSheet.setActiveSelection("B1").setValue(SLData[i][0].toString());
          SpreadsheetApp.flush();


            var response = UrlFetchApp.fetch(url + url_ext + sheetID, {
              headers: {'Authorization': 'Bearer ' +  token
          }
        });
          //convert the response to a blob and store in our array
          blobs[i] = response.getBlob().setName(SLData[i][0] + '.pdf');

      }

    ReportSheet.setActiveSelection("B1").setValue(SLData[0][0]);
    //create new blob that is a zip file containing our blob array
      var zipBlob = Utilities.zip(blobs).setName(ClassName+': Student Reports'+'.zip');

      var subject = ClassName+ ": Individual Reports";
      var body = "How to print multiple files: Just select all the items you wish to print in Finder and tap Command-P (or choose File>Print). If your system can print those items, it will.";

      // If allowed to send emails, send the email with the PDF attachment
      if (MailApp.getRemainingDailyQuota() > 0) 
        GmailApp.sendEmail(email, subject, body, {
          htmlBody: body,
          attachments:[zipBlob]     
        });  

    SpreadsheetApp.getActiveSpreadsheet().toast('Reports are all done, please check you email.','Reports',5);

}

Предполагается создать файл в формате pdf с именами учеников. Когда zip загружен и распакован, в pdf-файлах содержится разметка для каждого учащегося.

Если я вывожу код «ответа» за пределы цикла, он создаст несколько PDF-файлов с данными только одного учащегося.

UPDATE Изменено в приведенном ниже коде, но теперь оно создает PDF для каждого учащегося, но у каждого есть информация о последнем учащемся (отметка и имя).

function PrintReport() {
SpreadsheetApp.getActiveSpreadsheet().toast('Writing the reports.','Printing Reports');

    var email = Session.getActiveUser().getEmail();
    var TodayDate = new Date();
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ClassName = ss.getName();
    var StudentList = ss.getSheetByName('Mark Sheet');
    var StudentCount = StudentList.getRange("A2").getValue();
    var SLData = StudentList.getRange(7,1,StudentCount).getValues();
    var ReportSheet = ss.getSheetByName('Student Report');
    var sheetID = ss.getSheetByName('Student Report').getSheetId();
    var blobs = [];

hideAllSheetsExcept('Student Report');

for (var i = 0; i < StudentCount; i++){
      ReportSheet.setActiveSelection("B1").setValue(SLData[i][0].toString());
      SpreadsheetApp.flush();
      //convert the response to a blob and store in array
      blobs.push(ss.getBlob().getAs('application/pdf').setName(SLData[i][0] + '.pdf'));
      //creates a pdf of the last student's information for everyone!
    }

ReportSheet.setActiveSelection("B1").setValue(SLData[0][0]);
//create new blob that is a zip file containing our blob array
  var zipBlob = Utilities.zip(blobs).setName(ClassName+': Student Reports'+'.zip');

  var subject = ClassName+ ": Individual Reports";
  var body = "How to print multiple files: Just select all the items you wish to print in Finder and tap Command-P (or choose File>Print). If your system can print those items, it will.";

  // If allowed to send emails, send the email with the PDF attachment
  if (MailApp.getRemainingDailyQuota() > 0) 
    GmailApp.sendEmail(email, subject, body, {
      htmlBody: body,
      attachments:[zipBlob]     
    });  

SpreadsheetApp.getActiveSpreadsheet().toast('Reports are all done, please check you email.','Reports',5);
UnHideEverything();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...