【发布时间】: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