【问题标题】:Converting google spreadsheet to XLSX or ODS using GAS使用 GAS 将 google 电子表格转换为 XLSX 或 ODS
【发布时间】:2014-07-27 21:10:46
【问题描述】:

我想将一些 Google 电子表格转换为 Excel(首选 xlsx)。
我已经阅读了几个关于如何实现这一点的主题,但我无法让它运行。
我读过的线程中有Google Apps Script: Save Spreadsheet as ODS for Local Backup 和Google apps script to email google spreadsheet excel version

为了与我发现的代码保持接近并获得有关它为什么不起作用的更多信息,我修改了我发现的代码,使其仅处理几个文件,并且 try-catch 已被删除。

****************** Not working code **************
function contentODS(key, gid) 
{
   var file = DocsList.getFileById(key); 

   var fetchParameters = oAuth();

   var url = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=" + key + "&gid=" + gid + "&exportFormat=ods";
   var response = UrlFetchApp.fetch(url, fetchParameters);

   var fileBlob = response.getBlob();  
   return fileBlob;
}

function oAuth()
{ // https://stackoverflow.com/questions/24493203/google-apps-script-save-spreadsheet-as-ods-for-local-backup
  var oauthConfig = UrlFetchApp.addOAuthService("spreadsheets");
  var scope = "https://spreadsheets.google.com/feeds" 
  oauthConfig.setConsumerKey("anonymous");
  oauthConfig.setConsumerSecret("anonymous");
  oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope=" + scope);
  oauthConfig.setAuthorizationUrl("https://accounts.google.com/OAuthAuthorizeToken");    
  oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");   

  var requestData =
  {
    "oAuthServiceName":   "spreadsheets",
    "oAuthUseToken":      "always",
    "muteHttpExceptions": true,
    "method":             "DELETE",
  };
  return requestData;
}

function eachSheet(key, newFolderId)
{
  var ss = SpreadsheetApp.openById(key);
  var ssId = ss.getId();
  var ssName = ss.getName();
  var howManySheets = ss.getNumSheets();

  for (var sheetIndex=0; sheetIndex < howManySheets; sheetIndex++)
  {   
     var activeSheet = ss.getSheets()[sheetIndex];
     var activeName = activeSheet.getName();
     var activeId = activeSheet.getSheetId();
     var time = new Date();
     var fileName = time + " Backup: " + ssName + " " + activeName + ".ods";
     var blob = contentODS(ssId, activeId);
     var folder = DocsList.getFolderById(newFolderId);  
     folder.createFile(blob).rename(fileName);
   } 
}

function backUpMaker()
{
  var backupDirectory = 'Backup';
  var folders = DriveApp.getRootFolder().getFoldersByName(backupDirectory);
  var backupFolderId = undefined;
  if (folders.hasNext()) backupFolderId = folders.next().getId();
  else return;  // File doe not exist

  var timeNow = new Date();  
  var newFolder = DocsList.createFolder(timeNow);
  var newFolderId = newFolder.getId();
  newFolder.addToFolder(DocsList.getFolderById(backupFolderId));
  newFolder.removeFromFolder(DocsList.getRootFolder());
  var sheets = DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS);
  while (sheets.hasNext())
  {
    var sheet = sheets.next();
    var name = sheet.getName();

    var filesToSave = [ 'My-Agenda', 'My-Kalender' ];
    var numFiles = filesToSave.length;

    for (var i=0; i<numFiles; i++)
    {
       if (name == filesToSave[i])
       {
          var sheetId = sheet.getId();
          var csv = eachSheet(sheetId, newFolderId); 
          break;
       }  
    }   
  }
  var backupFolder = DocsList.getFolderById(backupFolderId);
  var newFiles = newFolder.getFiles();
  var numFiles = newFiles.length;

  if (numFiles > 0)
  {
     var nameZipFile = timeNow + '.zip';
     backupFolder.createFile(Utilities.zip(newFiles, nameZipFile));
  } 

  newFolder.setTrashed(true);
}

在 var response = UrlFetchApp.fetch(url, fetchParameters); 处运行 backupmaker 失败
并表示服务电子表格的验证失败

我应该怎么做才能让它工作。

【问题讨论】:

  • 您使用的是新版本的电子表格吗?
  • 新版本的底部有一个绿色的小图标,里面有一个“v”(就像一种复选框),默认为 1000 行而不是 100 行以及其他差异......它是还有添加菜单的版本。
  • 这就是为什么您引用的代码实际上不起作用的原因...用于调用 urlFetch 的 url 仅适用于旧版本。我搜索了一个解决方案,但是虽然我找到了 pdf 转换的代码,但我为获得 xls 转换所做的所有测试都失败了......所以,目前,我无法为您提供解决方案,抱歉。
  • 我在 Amit Agarwal 的网站上找到了它:http://ctrlq.org/code/19699-email-google-spreadsheet-as-pdf 我测试成功了 ;)
  • 顺便说一句,您有 2 个我回答的未决问题,您认为这些答案不可接受吗?

标签: google-apps-script google-sheets


【解决方案1】:

您可以使用Advanced Drive Service 获取导出 URL,并使用脚本的 OAuth2 令牌下载文件。

function exportAsExcel(spreadsheetId) {
  var file = Drive.Files.get(spreadsheetId);
  var url = file.exportLinks['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });
  return response.getBlob();
}

function test() {
  var spreadsheetId = 'SPREADSHEET ID HERE';
  DriveApp.createFile(exportAsExcel(spreadsheetId));
}

【讨论】:

  • 作为后续问题:是否可以创建 Excel 电子表格并像 Google 电子表格一样写入它?我试过DriveApp.createFile('newExcelFile', '','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); 这确实创建了文件,它没有工作表,也不能与SpreadsheetApp 一起使用。
  • 不幸的是,没有 API 可以对存储在云端硬盘中的 Excel 文件进行逐个单元格的操作。您必须下载该文件,使用库在本地对其进行编辑,然后重新上传。或者,您可以上传一个并在请求中使用 convert: true 将其转换为 Google 电子表格。
猜你喜欢
  • 2021-03-21
  • 2022-07-19
  • 2017-05-28
  • 2013-05-15
  • 2020-07-19
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2013-08-25
相关资源
最近更新 更多