2014-06-30 134 views
0

我可以用一只手。我的公司广泛使用Google表格,当我们失去互联网连接时,我们需要一种访问文件的方式。Google Apps脚本:将电子表格保存为本地备份的ODS

我无法获得本网站上发现的任何示例,以便通过脚本从Google表格创建xls或ods。

我做了一个脚本来创建csv备份,可以从本地Google Drive文件夹访问。与小时触发器一起使用时,此脚本会创建在过去一小时内修改过的每张电子表格的每个工作表的csv文件,并将其放入一个文件夹中,并将其压缩到特定于备份的文件夹中。从那里我可以将zip文件移动到我们的本地服务器。

function backUpMaker() { 
    var backupFolderId = '<Id of Backup Folder>'; 
    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 lastUpdate = sheet.getLastUpdated(); 
    var timeHourAgo = new Date(); 
    timeHourAgo = timeNow - 3600000; 
    if(lastUpdate >= timeHourAgo){ 
     var sheetId = sheet.getId(); 
     var csv = eachSheet(sheetId,newFolderId); 
    } 
    } 
    var backupFolder = DocsList.getFolderById(backupFolderId); 
    try{ 
    backupFolder.createFile(Utilities.zip(newFolder.getFiles(), timeNow + '.zip')); 
    } catch(err) { 
    Logger.log(err); 
    } 
    newFolder.setTrashed(true); 
} 

function eachSheet(key,newFolderId) { 
    var ss = SpreadsheetApp.openById(key); 
    var ssId = ss.getId(); 
    var ssName = ss.getName(); 
    var howManySheets = ss.getNumSheets(); 
    try{ 
    for (var sheetIndex=0; sheetIndex < howManySheets; sheetIndex++) { 
    var activeSheet = ss.getSheets()[sheetIndex]; 
    var activeName = activeSheet.getName(); 
    if(activeName != 'Dropdowns'){  //Skip a hidden sheet used for validation on many of our spreadsheets 
     var activeId = activeSheet.getSheetId(); 
     var time = new Date(); 
     var fileName = time + " Backup: " + ssName + " " + activeName + ".csv"; 
     var csv = contentCSV(ssId,activeId); 
     var folder = DocsList.getFolderById(newFolderId); 
     folder.createFile(fileName, csv, 'text/plain'); 
    } 
    } 
    } catch(err) { 
    Logger.log(err) 
    } 
} 

function contentCSV(key,gid) { 
    var file = DocsList.getFileById(key); 
    var response =  UrlFetchApp.fetch("https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=" + key + 
       "&gid=" + gid + "&exportFormat=csv", oAuth()); 
    var fileText = response.getContentText(); 
    return fileText; 
} 

function oAuth() { 
    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", 
    }; 
    return requestData; 
} 

我该如何修改它以保存为ods而不是csv?还是有更好的方法来保存备份?感谢您的帮助!

工作的代码如下,由@哔叽-INSAS由于输入:

注:为了使这项工作,输入备份文件夹的ID键,然后选择ODS或通过注释掉其他选择XLSX。然后,您需要为backUpMaker()设置定时小时触发器。日志会捕获已暂时移动的文件的错误。这里是:

function backUpMaker() { 
    var backupFolderId = '0B5--------------------1ZX1k'; 
    //var exportFormat = 'ods'; 
    var exportFormat = 'xlsx'; 
    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 lastUpdate = sheet.getLastUpdated(); 
    var timeHourAgo = new Date(); 
    timeHourAgo = timeNow - 3600000; 
    if(lastUpdate >= timeHourAgo){ 
     try{ 
     var key = sheet.getId(); 
     var name = sheet.getName(); 
     var fileName = timeNow + " Backup: " + name + "." + exportFormat; 
     var blob = contentBackup(key,exportFormat); 
     var folder = DocsList.getFolderById(newFolderId); 
     folder.createFile(blob).rename(fileName); 
     } catch(err){ 
     Logger.log(err); 
     } 
    } 
    } 
    var backupFolder = DocsList.getFolderById(backupFolderId); 
    try{ 
    backupFolder.createFile(Utilities.zip(newFolder.getFiles(), timeNow + '.zip')); 
    } catch(err) { 
    Logger.log(err); 
    } 
    newFolder.setTrashed(true); 
} 

function contentBackup(key,exportFormat) { 
    try{ 
    if(exportFormat == 'xlsx'){ 
     exportFormat = 'xls'; 
    } 
    var file = DocsList.getFileById(key); 
    var response =  UrlFetchApp.fetch("https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=" + key + 
        "&exportFormat=" + exportFormat, oAuth()); 
    var fileBlob = response.getBlob(); 
    return fileBlob; 
    } catch(err) { 
    Logger.log(err) 
    } 
} 

function oAuth() { 
    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", 
    }; 
    return requestData; 
} 
+0

SE有一个Web应用程序站点。 – pnuts

+0

为什么不启用云端硬盘离线访问? –

+0

@ZigMandel,是的,我想到了,但我没有访问每个人的浏览器。奇怪这更容易。 – GASy

回答

0

你的代码需要很少的变化来获得ods文件。

2个区别:urlFetch中的请求格式变为“ods”,返回的对象不再是字符串,而是一个blob。

除此之外,我保留了你写的所有表单选择函数,它看起来也很好。 (你做得很好!)。

以下是我从贵公司复制的完整代码,并按照说明进行了更改。我的测试工作正常。

function backUpMaker() { 
    var backupFolderId = '0B3qS--------------TXdlY2M'; 
    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 lastUpdate = sheet.getLastUpdated(); 
    var timeHourAgo = new Date(); 
    timeHourAgo = timeNow - 3600000; 
    if(lastUpdate >= timeHourAgo){ 
     var sheetId = sheet.getId(); 
     var csv = eachSheet(sheetId,newFolderId); 
    } 
    } 
    var backupFolder = DocsList.getFolderById(backupFolderId); 
    try{ 
    backupFolder.createFile(Utilities.zip(newFolder.getFiles(), timeNow + '.zip')); 
    } catch(err) { 
    Logger.log(err); 
    } 
    newFolder.setTrashed(true); 
} 

function eachSheet(key,newFolderId) { 
    var ss = SpreadsheetApp.openById(key); 
    var ssId = ss.getId(); 
    var ssName = ss.getName(); 
    var howManySheets = ss.getNumSheets(); 
    try{ 
    for (var sheetIndex=0; sheetIndex < howManySheets; sheetIndex++) { 
    var activeSheet = ss.getSheets()[sheetIndex]; 
    var activeName = activeSheet.getName(); 
    if(activeName != 'Dropdowns'){  //Skip a hidden sheet used for validation on many of our spreadsheets 
     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); 
    } 
    } 
    } catch(err) { 
    Logger.log(err) 
    } 
} 

function contentODS(key,gid) { 
    var file = DocsList.getFileById(key); 
    var response =  UrlFetchApp.fetch("https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=" + key + 
       "&gid=" + gid + "&exportFormat=ods", oAuth()); 
    var fileBlob = response.getBlob(); 
    return fileBlob; 
} 

function oAuth() { 
    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", 
    }; 
    return requestData; 
} 
+0

太棒了,谢谢。与csv版本不同,似乎使用ods我不再需要为电子表格中的每个工作表创建单独的文件,它会将整个电子表格保存在一个ods文件中。那是对的吗? – GASy

+0

确实如此。 Ods是“全功能”格式...您也可以使用相同的代码获得xlsx格式,只需更改urlFetch调用即可。顺便说一句,请考虑接受答案。谢谢 –

+0

接受的答案。我无法告诉你我是多么高兴,这是有效的。我会暂时在没有表格选择器的情况下发布代码,否则你会得到重复的ods文件。那么如果别人需要这样的东西,你可以复制和粘贴。当我试图创建斑点之前,我认为我使它变得太复杂,无法让它产生除PDF之外的任何东西。 – GASy

相关问题