2017-02-19 21 views
0

我想知道行结果筛选器在谷歌应用程序脚本,但我没有达到获得它们,我总是获得选择或工作表的所有行。我已经调查过,似乎这个API不可能。你知道这是真的还是以另一种方式获得这些行? THX是否可以知道Google Spreadsheet中的过滤器的行结果?

function docReport() { 
    try { 
    splashScreen("Generando informe...");  
    var activeSheet = SpreadsheetApp.getActiveSheet();  
    var numberOfColumns = activeSheet.getLastColumn(); 
    var numberOfRows = activeSheet.getLastRow(); 
    var activeRow = activeSheet.getRange(1, 1, numberOfRows, numberOfColumns).getValues(); 

    var docReport = DocumentApp.create(REPORT_FILE_NAME); 
    var bodyReport = docReport.getBody(); 
    bodyReport.setAttributes(stylePage); 

    for (var row = 1; row < numberOfRows; row++) { 
     if (!isEmpty(activeRow[row], numberOfColumns)) { 
     var image = UrlFetchApp.fetch(IMG_BBVA); 
     /*var paragraph = bodyReport.appendParagraph(""); 
     paragraph.addPositionedImage(image).setHeight(100).setWidth(98); 
     paragraph.appendText("\r\n"); 
     paragraph.setAttributes(styleTitle);*/ 

     //bodyReport.appendImage(image).setHeight(100).setWidth(98); //Incluimos la imagen de cabecera 

     bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT); 
     bodyReport.appendParagraph("   SERVICIOS JURÍDICOS").setAttributes(styleTextBlue); 
     bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate); 

     for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador 
      if (activeRow[row][col] != "") { //Si el valor es vacio no lo imprimimos 
      if (activeRow[0][col] == "NORMA") 
       bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido 
      else { 
       bodyReport.appendParagraph(activeRow[0][col] + ":").setAttributes(styleTitle); //Incluimos título 
       bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleText); //Incluimos contenido 
      } 
      bodyReport.appendParagraph(""); 
      } 
     } 
     bodyReport.appendPageBreak(); 
     } 
    } 
    bodyReport.appendPageBreak();  
    docReport.saveAndClose(); 
    MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado", 
         'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl()); 
    SpreadsheetApp.flush(); 
    SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n'); 
    } catch(e) { 
    Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber) 
    Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss")); 
    MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog()); 
    } 
} 
+0

snippet please。 –

+0

完成@CedricDruck,thx – Richi

回答

0

最后,我已经能够实现我的目标,但它不是一个通常的解决方案,但它的工作原理。在处理工作表之前,我选择所有行并放入背景颜色,Google Spreadsheet仅将背景颜色设置为过滤后的行。然后,我处理所有工作表,但我知道已过滤的行,因为我询问了它的背景。我希望这个解决方案适合你,并对你有用。谢谢。

function docReport() { 
    try { 
    splashScreen("Generando informe...");  
    var activeSheet = SpreadsheetApp.getActiveSheet();  
    var numberOfColumns = activeSheet.getLastColumn(); 
    var numberOfRows = activeSheet.getLastRow(); 
    var activeRow, rowRange; 
    var titleRow = activeSheet.getRange(1, 1, 1, numberOfColumns).getValues(); 

    //Set los fondos a otro color para identificar las líneas a las líneas que tienen filtro 
    activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#fffff9"); 

    var docReport = DocumentApp.create(REPORT_FILE_NAME); 
    var bodyReport = docReport.getBody(); 
    bodyReport.setAttributes(stylePage); 

    for (var row = 2; row <= numberOfRows; row++) { //Empieza en 2 ya que no incluyo la fila de los títulos 
     rowRange = activeSheet.getRange(row, 1, 1, numberOfColumns); 
     if (rowRange.getBackground() == "#fffff9") { //If it has #fffff9 background, it means that it is a filtered row 
     activeSheet.setActiveSelection(row + ":" + row).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco 
     activeRow = rowRange.getValues(); 
     if (!isEmpty(activeRow[0], numberOfColumns)) { 
      var image = UrlFetchApp.fetch(IMG_BBVA); 
      bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT); 
      bodyReport.appendParagraph("   S.J.").setAttributes(styleTextBlue); 
      bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate); 

      for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador 
      if (activeRow[0][col] != "") { //Si el valor es vacio no lo imprimimos 
       if (col == COLUMN_NORMA) 
       bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido 
       else { 
       bodyReport.appendParagraph(titleRow[0][col]).setAttributes(styleTitle); //Incluimos título 
       bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleText); //Incluimos contenido 
       } 
       bodyReport.appendParagraph(""); 
      } 
      } 
      bodyReport.appendPageBreak(); 
     } 
     } 
    } 
    activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco menos primera fila 
    bodyReport.appendPageBreak();  
    docReport.saveAndClose(); 
    MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado", 
         'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl()); 
    SpreadsheetApp.flush(); 
    SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n'); 
    } catch(e) { 
    Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber) 
    Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss")); 
    MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog()); 
    } 
} 
0

不,这是不可能的一个电子表格过滤器是一个特定的“观点”,不能在应用程序的脚本进行检索。不过,如果你知道它的参数,可以手动重建过滤器视图。使用getDataRange()。getValues()将检索所有数据,然后在此表上应用filter function

相关问题