Google脚本可将Google表格转换为Excel并通过电子邮件发送给

时间:2019-06-18 16:53:11

标签: google-apps-script google-sheets google-apps google-sheets-formula google-sheets-query

每周我都有一些不同的Google表格需要以excel格式下载,删除隐藏的行,修复数据然后通过电子邮件发送出去。

这可能会非常耗时,因此我想制作/部署一个可以自动执行此过程的脚本。

我进行了大量搜索以尝试使其正常运行,但是我遇到了一些问题。

首先,通过查询/导入范围公式提取工作表中的数据,因此一旦下载到excel中,所有数据将如下所示:

=IFERROR(__xludf.DUMMYFUNCTION("""COMPUTED_VALUE"""),"No")

这会阻止过滤任何数据。目前,我正在通过复制excel中的所有数据并仅粘贴值来解决此问题。我希望更正excel文件,这样就不必这样做了。

此外,我希望能够通过电子邮件发送转换后的Excel文件。

我找到了适用于此的以下代码:

function getGoogleSpreadsheetAsExcel(){
  
  try {
    
    var ss = SpreadsheetApp.getActive();
    
    var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + ss.getId() + "&exportFormat=xlsx";
    
    var params = {
      method      : "get",
      headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
      muteHttpExceptions: true
    };
    
    var blob = UrlFetchApp.fetch(url, params).getBlob();
    
    blob.setName(ss.getName() + ".xlsx");
    
    MailApp.sendEmail("amit@labnol.org", "Google Sheet to Excel", "The XLSX file is attached", {attachments: [blob]});
    
  } catch (f) {
    Logger.log(f.toString());
  }
}

这通常可行,但再次遇到上述问题,即importrange数据不正确并显示为= IFERROR(__ xludf.DUMMYFUNCTION。

还有两列(A和J)被隐藏,需要删除。

此外,我希望能够通过GUI更改电子邮件地址,主题和消息。但这并不重要,不需要。

我知道这是一个很大的问题,但是任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

此脚本解决了部分问题。

  1. 创建工作表的副本,然后在此过程中将公式转换为值
  2. 删除列

注意:有多个选项可用于将公式转换为值。

就通过GUI更改电子邮件地址,主题和消息而言,我建议使用custom sidebar


function so5665379502(){
  /*
  // The purpose of this script is to copy the content of one sheet to another;
  // converting formulas to values 
    // and deleting columns
  */

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetname = "ejbsheet01";
    var sourcesheet = ss.getSheetByName(sheetname); 
  var destname = "ejbsheet02";
    var destinationSheet = ss.getSheetByName(destname);
    sourcesheet.activate();
  var range = sourcesheet.getDataRange();
  var rFC = range.getColumn();
  var rLC = range.getLastColumn();
  var rFR = range.getRow();
  var rLR = range.getLastRow();
  //Logger.log("DEBUG: the data range = "+range.getA1Notation()+", column 1 = "+rFC+", the last column = "+rLC+", first row = "+rFR+", last row = "+rLR);

  //  syntax copyValuesToRange(sheet, column, columnEnd, row, rowEnd)
  range.copyValuesToRange(destinationSheet, rFC, rLC, rFR, rLR);

  // delete column J first so that other column numbers don't chnage.
  // column J = 10
  destinationSheet.deleteColumn(10);
  // Delete Column A
  // column A = 1
  destinationSheet.deleteColumn(1);  
}

之前
注意:A和J列已隐藏 BEFORE


之后
注意:隐藏的列不见了,数据是值,而不是公式。 AFTER