使用表格中的图表Blob覆盖云端硬盘中的PNG文件

时间:2018-07-26 23:58:27

标签: google-apps-script google-sheets google-drive-api

我在使用Drive.Files.update()来覆盖/更新驱动器中的工作表中的一系列PNG文件时遇到麻烦。不断返回Response code: 404. Message: Not Found. (line 27, file "SaveCharts")

任何人都可以向我指出我在做什么错吗?我需要指定一个文件夹吗?

谢谢...尼克

function saveChartstoGdrive(){
  //Getting chart from the current spreadsheet
  var targetspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = targetspreadsheet.getSheetByName('Sales Graph');
  var charts = sheet.getCharts();         
  var chartBlobs=new Array(charts.length);
  var filePrefix="scrlxz";
  
  //loop through charts saving each to gdrive
  for(var i=0;i<charts.length;i++){
    
    //build each chart
    var builderChart = charts[i].modify();
    builderChart.setOption('width', 1400);
    builderChart.setOption('height', 900);
    var newChart =builderChart.build();
    chartBlobs[i]= newChart.getAs('image/png');
    
    //make sure we have the correct file and prepare for saving
    var fileName = filePrefix+[i]+".png";
    var fileId = DriveApp.searchFiles(title = fileName);
    //var fileId = DriveApp.searchFiles(name = fileName);
    // var fileTyper = {title: fileName, mimeType: 'image/png'};
    var contentBlob = chartBlobs[i];
    
    //save file to ggdrive
    var myVar = Drive.Files.update({mimeType: 'image/png'}, fileId, contentBlob);
    
    // other ideas i've tried
    // var myVar = Drive.Files.update(fileTyper, fileId, contentBlob);
    // updateFileContent(fileId, contentBlob, function(response) {console.log(response);})                      
    // var myVar = Drive.Files.update(fileId, contentBlob);
  }         
}

1 个答案:

答案 0 :(得分:0)

此修改如何?

修改点:

  • 关于DriveApp.searchFiles(title = fileName),在此脚本中,不会发生任何错误。但是,当它尝试使用next()检索值时,会发生错误。并且title = fileName不用作搜索查询。
  • DriveApp.searchFiles(title = fileName)检索的值是FileIterator。

通过以上几点,可以认为发生了这种错误。为了消除此错误,请进行以下修改。

来自:
var fileId = DriveApp.searchFiles(title = fileName);
至 :
var fileId = DriveApp.searchFiles("title='" + fileName + "'").next().getId();

您还可以通过getFilesByName()使用fileName

var fileId = DriveApp.getFilesByName(fileName).next().getId();

注意:

在此修改中,它假设以下几点。

  • 图表构建器起作用。
  • fielNamevar fileName = filePrefix+[i]+".png"的文件在您的Google云端硬盘中只有一个。
  • 在Google云端硬盘中,文件由文件ID管理。因此,具有相同文件名的文件可以存在,因为文件ID不同。使用searchFiles()getFilesByName()检索文件时,如果Google云端硬盘中有多个文件名相同的文件,则需要准备脚本以进行处理。所以起初,我问过带有文件名的文件数。

参考文献:

如果我误解了你的情况,对不起。