【问题标题】:Sending excel attachment from google sheet but only current tab从谷歌工作表发送 excel 附件,但只发送当前选项卡
【发布时间】:2021-03-24 16:56:34
【问题描述】:

此代码运行良好,但发送整个工作表,我只想发送当前选项卡/工作表。如何使它仅捕获当前选项卡列 A-H 而不是带有所有选项卡的整个 google 工作表?

function send_report_email(spreadsheetId) {
  var spreadsheet   = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId(); 
  var file          = DriveApp.getFileById(spreadsheetId);
  var url           = 'https://docs.google.com/spreadsheets/d/'+spreadsheetId+'/export?format=xlsx';
  var token         = ScriptApp.getOAuthToken();
  var response      = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

 var fileName = (spreadsheet.getName()) + '.xlsx';
 var blobs   = [response.getBlob().setName(fileName)];

 var receipient = "andrew@barrelrace.com"
 var subject = "xxxx"
 var emailbody = "first line \n\nsecond line \n\nCheers!,"

 MailApp.sendEmail(receipient, subject, emailbody, {attachments: blobs});
  }

【问题讨论】:

  • 尝试获取工作表 ID 并将其作为 gid 参数附加到您的 URL - 有关详细信息,请参阅 this Stack Overflow question's 答案。
  • 你能用上面的代码给我一个例子吗?
  • 我想出了将 gid 放在哪里......但现在我很好奇我是否可以让它只下载该特定选项卡的 A 到 H 列?
  • 我可能会尝试将您想要的列复制到新的临时工作表,获取该工作表的 GID,导出 Excel 文件,然后删除临时工作表

标签: google-apps-script google-sheets


【解决方案1】:

您可以按照以下步骤来实现您的目标:

  1. 创建临时工作表
  2. 将数据从 A-H 复制到临时表
  3. 删除列 H 之后的列(这是可选的,因为您只将 A-H 列的数据复制到临时工作表中,某些应用程序可能仍会显示已删除的列)
  4. 获取临时工作表的gid
  5. 通过将/export?format=xlsx&gid='+tempSheetId 添加到网址来获取工作表。
  6. 获取响应 blob 并附加到电子邮件中。
  7. 删除临时工作表。

示例:

样本数据:

代码:

function send_report_email() {
  var spreadsheet   = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var sheetRange = sheet.getDataRange();

  //check if tempsheet is existing and delete if true
  var tempSheet = spreadsheet.getSheetByName("tempSheet");
  if (tempSheet != null) {
    spreadsheet.deleteSheet(tempSheet);
  }

  //copy data from Sheet1 to temp sheet
  var temp = spreadsheet.insertSheet("tempSheet", spreadsheet.getSheets().length);
  sheetRange.copyTo(temp.getRange(1,1));
  //remove columns after column H.
  temp.deleteColumns(9, 18);
  
  var tempSheetId = temp.getSheetId();    
  var spreadsheetId = spreadsheet.getId(); 

  var url           = 'https://docs.google.com/spreadsheets/d/'+spreadsheetId+'/export?format=xlsx&gid='+tempSheetId;
  var token         = ScriptApp.getOAuthToken();
  var response      = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  var fileName = (spreadsheet.getName()) + '.xlsx';
  var blobs   = [response.getBlob().setName(fileName)];

  var receipient = "email here"
  var subject = "xxxx"
  var emailbody = "first line \n\nsecond line \n\nCheers!,"

  MailApp.sendEmail(receipient, subject, emailbody, {attachments: blobs});
  //delete temporary sheet
  spreadsheet.deleteSheet(temp);
}

电子邮件附件:

参考:

【讨论】:

  • 谢谢!发现创建一个不同的选项卡更容易。问题,使用我上面附加的常规代码获取该特定选项卡的 GID 的代码是什么?因此,var URL 将实际获取当前工作表 gid 的位置,而不是我必须手动输入。
  • 要获取特定选项卡的 GID,可以使用getSheetId()。在您的代码中,您可以添加 var sheetId = spreadsheet.getSheetByName("Insert Sheet Name Here").getSheetId()var sheetId = SpreadsheetApp.getActiveSheet().getSheetId()
  • @LonestarDads - 如果您觉得我的回答对您有用,请考虑accepting and upvoting
猜你喜欢
  • 2017-07-06
  • 2020-09-07
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多