Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 每次编辑时,将Google电子表格导出到.XLSX_Google Apps Script_Google Sheets_Export To Excel - Fatal编程技术网

Google apps script 每次编辑时,将Google电子表格导出到.XLSX

Google apps script 每次编辑时,将Google电子表格导出到.XLSX,google-apps-script,google-sheets,export-to-excel,Google Apps Script,Google Sheets,Export To Excel,我想要一个谷歌脚本,它可以在进行编辑时自动将电子表格导出到.XLSX,覆盖任何以前的版本。作为模板,我创建了以下代码: 函数onEdit(){ var s=SpreadsheetApp.getActiveSheet(); var r=s.getActiveCell(); 如果(r.getColumn()!=1){//检查该列 var row=r.getRow(); 变量时间=新日期(); 时间=实用程序。格式日期(时间,“GMT-08:00”,“MM/dd/yy,hh:MM:ss”); Spre

我想要一个谷歌脚本,它可以在进行编辑时自动将电子表格导出到.XLSX,覆盖任何以前的版本。作为模板,我创建了以下代码:

函数onEdit(){
var s=SpreadsheetApp.getActiveSheet();
var r=s.getActiveCell();
如果(r.getColumn()!=1){//检查该列
var row=r.getRow();
变量时间=新日期();
时间=实用程序。格式日期(时间,“GMT-08:00”,“MM/dd/yy,hh:MM:ss”);
SpreadsheetApp.getActiveSheet().getRange('A'+行.toString()).setValue(时间);
变量id='我的电子表格\u键'
var url='1〕https://docs.google.com/feeds/';
var doc=UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
googleOAuth(('docs',url)).getBlob()
DocsList.createFile(doc.rename('newfile.xls'))
};
};
googleOAuth函数(名称、范围){
var oAuthConfig=UrlFetchApp.addOAuthService(名称);
oAuthConfig.setRequestTokenUrl(“https://www.google.com/accounts/OAuthGetRequestToken?scope=“+范围);
oAuthConfig.setAuthorizationUrl(“https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl(“https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey('anonymous');
oAuthConfig.setConsumerCret('anonymous');
返回{oAuthServiceName:name,oAuthUseToken:“始终”};
}
然而,它似乎没有出口。或者,如果是出口,我不确定这是在哪里发生的


有什么想法吗?

确实没有!可能是因为oAuth函数没有得到正确的授权,也没有执行这种操作

您必须创建一个可安装的触发器

尝试下面的脚本并运行
authorize
功能

我还更改了一些细节:
时区
直接取自电子表格,
id
也取自活动电子表格

另外请注意,新创建的XLSX不会覆盖以前的任何文件,您将获得许多同名文档!如果您只想保留最新版本,那么您应该自己处理,在创建新版本之前,获取所有文档名称“new file”,并使用
file.setTrashed(true)
删除它们

这将与以下两行代码一样简单:

var oldVersions = DocsList.find('newfile.xls');
for(var d in oldVersions){oldVersions[d].setTrashed(true)};
守则:

function myOnEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveCell();
  if( r.getColumn() != 1 ) { //checks the column
    var row = r.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, ss.getSpreadsheetTimeZone(), "MM/dd/yy, hh:mm:ss");
    var id = ss.getId();
    s.getRange('A' + row.toString()).setValue(time); 
    var url = 'https://docs.google.com/feeds/';
    var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
                                googleOAuth_('docs',url)).getBlob()
    DocsList.createFile(doc).rename('newfile.xls')  
  }
}

function authorise(){
  // function to call to authorize googleOauth
  var id=SpreadsheetApp.getActiveSpreadsheet().getId();
  var url = 'https://docs.google.com/feeds/';
  var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
                            googleOAuth_('docs',url)).getBlob()
}
function googleOAuth_(name,scope) {
  var oAuthConfig = UrlFetchApp.addOAuthService(name);
  oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
  oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
  oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
  oAuthConfig.setConsumerKey('anonymous');
  oAuthConfig.setConsumerSecret('anonymous');
  return {oAuthServiceName:name, oAuthUseToken:"always"};
}

编辑:在您的评论之后,这里是一个仅每30秒保存一次的版本(如果未进行编辑,则保存时间更长)。如果需要,可以轻松地将时间值更改为另一个间隔

重新运行authorize函数以初始化scriptProperty

function myOnEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveCell();
  if( r.getColumn() != 1 ) { //checks the column
    var row = r.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, ss.getSpreadsheetTimeZone(), "MM/dd/yy, hh:mm:ss");
    var id = ss.getId();
    s.getRange('A' + row.toString()).setValue(time); 
    var lastSaveTime = new Date(Utilities.jsonParse(ScriptProperties.getProperty('exportTime')));
    var now = new Date().getTime();
    Logger.log(now - lastSaveTime.getTime())
    if (now - lastSaveTime.getTime() > 60000){ // delete every minute
      var oldVersions = DocsList.find('newfile.xls');
      for(var d in oldVersions){oldVersions[d].setTrashed(true)};
    }
    if (now - lastSaveTime.getTime() > 30000){ // save every 30"
      var url = 'https://docs.google.com/feeds/';
      var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
                                  googleOAuth_('docs',url)).getBlob()
      DocsList.createFile(doc).rename('newfile.xls')  
      ScriptProperties.setProperty('exportTime',Utilities.jsonStringify(new Date()));
    }
  }
}

function authorise(){
  // function to call to authorize googleOauth + initialize the TIMER
  ScriptProperties.setProperty('exportTime',Utilities.jsonStringify(new Date()));
  var id = SpreadsheetApp.getActiveSpreadsheet().getId();
  var url = 'https://docs.google.com/feeds/';
  var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
                                googleOAuth_('docs',url)).getBlob()
}

function googleOAuth_(name,scope) {
  var oAuthConfig = UrlFetchApp.addOAuthService(name);
  oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
  oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
  oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
  oAuthConfig.setConsumerKey('anonymous');
  oAuthConfig.setConsumerSecret('anonymous');
  return {oAuthServiceName:name, oAuthUseToken:"always"};
}

由于谷歌API的变化,Serge的一些脚本不再可用,我将发布我的脚本,基本上将当前电子表格导出到
xlsx
(请注意,不支持导出到
xls
),并将其保存到名为
exports
的文件夹中。在执行此操作之前,它会删除以前的
xlsx
文件,并仅保留最新的文件,因此您无需计算时间或更改任何单元格:

function exportAsxlsx() {
  var spreadsheet   = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()
  var file          = Drive.Files.get(spreadsheetId);
  var url           = file.exportLinks[MimeType.MICROSOFT_EXCEL];
  var token         = ScriptApp.getOAuthToken();
  var response      = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  var blobs   = response.getBlob();
  var folder = DriveApp.getFoldersByName('Exports');
  if(folder.hasNext()) {
    var existingPlan1 = DriveApp.getFilesByName('newfile.xlsx');
    if(existingPlan1.hasNext()){
      var existingPlan2 = existingPlan1.next();
      var existingPlanID = existingPlan2.getId();
      Drive.Files.remove(existingPlanID);
    }
  } else {
    folder = DriveApp.createFolder('Exports');
  }
  folder = DriveApp.getFoldersByName('Exports').next();
  folder.createFile(blobs).setName('newfile.xlsx')
}

如果没有特定文件夹,它还会创建该文件夹。您可以使用这些命令并查看这些类是如何工作的。请注意,您需要从
Resources->Advanced Google Services->Drive API
启用驱动API,方法是将其切换到
上的
,也可以从Google开发者控制台启用驱动API(请参阅详细说明)。我还设置了一个简单的触发器,在每次编辑时调用此函数。这可以通过以下方式完成:
资源->当前项目的触发器->添加新触发器
。你不需要添加任何库。

你是某种谷歌应用程序脚本之神。非常感谢你。每次保存时,脚本似乎运行得很慢,因此我想我将对其进行修改,使其每30秒自动保存一份excel工作表,并将“Column Modified”函数放在一个单独的OneEdit脚本中。因此,我删除了onEachEdit函数的“Column Modified”部分,并使用了“save to.XLS”功能运行触发器,而不是每分钟运行一次。现在,当我运行authorize时,我得到以下错误:
返回代码404的请求失败。截断的服务器响应:-)谢谢:-)这可能是个好主意,您可以在脚本中添加第二个条件,仅在上次导出后30分钟后保存。例如,使用ScriptProperties保存时间值。也请考虑接受答案。关于错误,在授权代码中确实存在错误…格式设置为html而不是xls。。。抱歉,两个版本的更新都很好。我试图将“删除额外副本”功能也添加到分钟计时器中,因此我设置了一个触发器以每分钟运行该功能。但它似乎不起作用。还有,除了最新的excel文档之外,还有什么地方可以删除所有的文档呢?标题和第一段写的是XLSX,但代码使用的是XLS。由于导出到XLS的已接受答案代码看起来应该对问题进行编辑。另一方面,DocList和oAuthConfig被弃用。看见