【问题标题】:Google Script to convert a Google Sheet to Excel and Email it谷歌脚本将谷歌表格转换为 Excel 并通过电子邮件发送
【发布时间】:2019-06-18 16:53:11
【问题描述】:

每周我都会有一些不同的 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());
  }
}

这主要是可行的,但再次遇到上述导入范围数据不正确并显示为 =IFERROR(__xludf.DUMMYFUNCTION.

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

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

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

【问题讨论】:

  • 您可以编写一个谷歌脚本函数,用实际值替换由importrange 公式填充的单元格值,并在下载/通过电子邮件发送工作表之前调用它。我建议将此问题集中在该问题上,并将您的其他问题(如电子邮件 GUI)分成其他 SO 问题。
  • @DustinMichels+1 就我个人而言,我会创建 Google 电子表格的副本,然后使用 copyTo(destination, copyPasteType, transposed) 命令 Doc ref 复制工作表,将公式转换为值。然后将这些工作表转换为 Excel。

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


【解决方案1】:

此脚本解决了您的部分问题。

  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 列被隐藏


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

【讨论】:

  • 你好。如何在不丢失源工作表样式的情况下克隆工作表?
  • 嗨@Gavis 请将此作为一个新问题提出。确保准确描述“工作表”(电子表格文件或单个“工作表”/选项卡)的含义以及“克隆”的含义,并描述在新格式上进行格式化时所遵循的确切过程工作表与来源不同。
  • 嗨@tedinoz在这里你可以看到我的问题stackoverflow.com/questions/71571243/…
猜你喜欢
  • 2012-09-24
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多