2014-10-30 2 views
0

Я пытаюсь создать файл. Он отлично работает, когда я запускаю следующий сегмент кода из отладчика в сценарии приложений. Однако, когда я запускаю его в реальном времени из электронной таблицы, он говорит, что у меня нет разрешения на вызов createfile. Все, что регистрируется, идентично. Проблема заключается не в том, что у меня нет полномочий, поскольку я единственный в электронной таблице и являюсь владельцем. Цель CSV, чтобы переместить его из моего Google вбивать данные для BigQuerycreateFile() в Google Apps Сценарий не работает должным образом

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;} else{datArray[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); 
    } 
} 
+0

Что * точно * является сообщение об ошибке, которое вы получаете? – azawaza

ответ

1

Вы упоминаете в своем комментарии на мой ответ, что вы используете onEdit для запуска сценария. Поскольку это простой триггер, ваш текущий подход не будет работать. Когда вы используете простые триггеры для запуска скрипта приложений, он запускается в изолированной программной среде с ограниченными разрешениями.

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

Лучшее, что я могу рекомендовать это создать вариант пользовательского меню с UI всплывающее окно с просьбой к номеру строки для экспорта. Если код запускается из меню пользователем, он запускается с полным разрешением для доступа к этой учетной записи.

В зависимости от вашего прецедента может работать и запланированный триггер. Он может запускаться каждые 10 минут или каждый час и экспортировать любые изменения в электронную таблицу. В этом случае скрипт приложений работает так же, как вы, с разрешения на доступ к своей учетной записи, и полученный 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

+0

Они вводят «X» в электронную таблицу, и запускается onEdit(), который затем вызывает SaveAsCSV (3). Это все еще функция? – user2939446

+0

OnEdit - это «Простой триггер», который также ограничен тем, что он может делать таким же образом, поэтому решение, вышедшее выше, применяется. Я отредактирую свой ответ, чтобы обратиться непосредственно к вашему делу. –

+0

Aw shucks. Спасибо хоть! – user2939446

Смежные вопросы