google Apps 脚本中的 createFile() 无法正常运行

Posted

技术标签:

【中文标题】google Apps 脚本中的 createFile() 无法正常运行【英文标题】:createFile() in google Apps Script is not functioning properly 【发布时间】:2014-10-30 19:19:06 【问题描述】:

我正在尝试创建一个文件。当我从应用程序脚本中的调试器运行以下代码段时,它工作正常。但是,当我从电子表格实时运行它时,它说我无权调用 createfile。记录的所有内容都是相同的。问题不是我没有权限,因为我是电子表格中唯一的人并且是所有者。 CSV 的目的是将其从我的谷歌驱动器转移到 BigQuery 的数据中

function saveAsCSV(row)  //Doc to Csv
//row = 3; //when this is uncommented and ran from the debugger, it works.

 try

var fileName=  Date.now()
fileName = fileName + ".csv";


var csvFile = convertRangeToCsvFile_(fileName,row);
Logger.log(csvFile); //Both times ran on the spreadsheet and from debug equals the same.

DriveApp.createFile(fileName, csvFile);


SpreadsheetApp.getActiveSpreadsheet().getSheetByName("New and Open").getRange("J" + row.toString()).setValue("");

loadCsv(fileName);


catch(e)Logger.log("B" + e.message); //No permission to create file




function convertRangeToCsvFile_(csvFileName, r) 

var ws = SpreadsheetApp.getActiveSpreadsheet();
try 
//var data = ws.getValues();
var csvFile = undefined;

var csv = "";
var row = r;

var datArray = Create2DArray(1,19);


  datArray[0][0] =  ws.getRange("A" + row.toString()).getValue().toString().toUpperCase();
  datArray[0][1] =  ws.getRange("B"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][2] =  ws.getRange("C"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][3] =  ws.getRange("D"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][4] =  ws.getRange("E"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][5] =  ws.getRange("F"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][6] =  ws.getRange("G"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][7] =  ws.getRange("H"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][8] =  ws.getRange("I"+row.toString()).getValue().toString().toUpperCase();
  datArray[0][9] =  new Date(ws.getRange("K"+row.toString()).getValue().toString()).getHours();
  datArray[0][10] =  new Date(ws.getRange("K"+row.toString()).getValue().toString()).getMinutes();
  datArray[0][11] =  new Date(ws.getRange("L"+row.toString()).getValue().toString()).getHours();
  datArray[0][12] =  new Date(ws.getRange("L"+row.toString()).getValue().toString()).getMinutes();
  datArray[0][13] =  new Date(ws.getRange("M"+row.toString()).getValue().toString()).getHours();
  datArray[0][14] =  new Date(ws.getRange("M"+row.toString()).getValue().toString()).getMinutes();
  datArray[0][15] =  new Date(ws.getRange("N"+row.toString()).getValue().toString()).getTime();
  datArray[0][16] =  new Date(ws.getRange("N"+row.toString()).getValue().toString()).getFullYear();
  datArray[0][17] =  new Date(ws.getRange("N"+row.toString()).getValue().toString()).getMonth();
  datArray[0][18] =  new Date(ws.getRange("N"+row.toString()).getValue().toString()).getDate();

for(var i = 0; i < 19; i++)
  if(datArray[0][i] == "")if(i > 9)datArray[0][i] = 0; elsedatArray[0][i] = "nil";  
  if(i < 18)csv += '"' + datArray[0][i] + '"' + ",";
  else csv += '"' + datArray[0][i] + '"'; 


Logger.log("A " + csv);
Logger.log(csv + "\n" + datArray[0].join(","));
csvFile = csv;
return csvFile;

  catch(err) 
    Logger.log("C" + err);
    Browser.msgBox(err);
   

【问题讨论】:

您收到的错误信息究竟是什么? 【参考方案1】:

您在对我的回答的评论中提到您正在使用 onEdit 触发脚本。由于这是一个简单触发器,因此您当前的方法将不起作用。当您使用简单触发器运行 Apps 脚本时,它会在权限减少的沙盒中运行。

见:https://developers.google.com/apps-script/guides/triggers/#restrictions

我能推荐的最好的方法是创建一个自定义菜单选项,其中包含一个 UI 弹出窗口,询问要导出的行号。如果代码是由用户从菜单触发的,它会以访问该用户帐户的完全权限运行。

根据您的用例,计划的触发器也可能起作用。它可以每 10 分钟或每小时运行一次,并将任何更改导出到电子表格。在这种情况下,Apps 脚本会以您的身份运行,并有权访问您的帐户,并且会在您的驱动器上创建生成的 CSV。

有关如何创建自定义菜单的详细信息:https://developers.google.com/apps-script/guides/triggers/#onopen

如何为用户创建表单的详细信息:https://developers.google.com/apps-script/guides/ui-service

时间驱动触发器的详细信息:https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers

【讨论】:

他们在电子表格中输入“X”,然后触发 onEdit(),然后调用 SaveAsCSV(3)。这还是自定义函数吗? OnEdit 是一个“简单触发器”,它的功能也受到限制,因此我在上面发布的解决方案适用。我将编辑我的答案以直接适用于您的案例。 哎呀。不过谢谢!

以上是关于google Apps 脚本中的 createFile() 无法正常运行的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps脚本中的Google Drive通知

使用 Apps 脚本对 Google 表格中的边框进行条件格式设置

如何从 Google 电子表格中的 Google Apps 脚本自动更新“站点地图”功能?

如何保护 Google 电子表格中的 Apps 脚本代码?

使用 Google Apps 脚本折叠 Google 文档中的元素 - 这可能吗?

从工作表中的 Google Apps 脚本访问 BigQuery 时需要登录错误