2014-10-30 1 views
0

파일을 만들려고합니다. 그것은 애플 리케이션 스크립트에서 디버거에서 다음 코드 세그먼트를 실행할 때 잘 작동합니다. 그러나 스프레드 시트에서 실시간으로 실행하면 createfile을 호출 할 수있는 권한이 없다고 말합니다. 기록되는 모든 것은 동일합니다. 문제는 내가 스프레드 시트에서 유일하게 소유자이며 소유자이기 때문에 권한이 없다는 것입니다. CSV 파일 목적은 BigQuery를Google Apps Script의 createFile()이 제대로 작동하지 않습니다.

당신은 스크립트를 실행하는 데은 onEdit을 사용하는 내 대답에 귀하의 코멘트에 언급
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

* 정확히 *이란 무엇입니까 사용자를 위해 양식을 작성하는 방법에 https://developers.google.com/apps-script/guides/triggers/#onopen

세부 사항 : 사용자 지정 메뉴를 만드는 방법에 대한

세부 사항 오류 메시지가 나타 납니까? – azawaza

답변

1

데이터에 드라이브 내 구글에서 이동하는 것입니다. 이것은 단순 트리거이므로 현재 접근 방식은 작동하지 않습니다. 간단한 트리거를 사용하여 Apps Script를 실행하면 사용 권한이 감소 된 샌드 박스에서 실행됩니다.

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

내가 내보낼 행 번호를 묻는 UI 팝업와 사용자 지정 메뉴 옵션을 만드는 것입니다 추천 할 수있는 최선. 사용자가 메뉴에서 코드를 실행하면 코드가 해당 사용자 계정에 액세스 할 수있는 전체 권한으로 실행됩니다.

사용 사례에 따라 예약 된 트리거가 작동 할 수도 있습니다. 10 분마다 또는 매시간 실행될 수 있으며 스프레드 시트에 변경 사항을 내보낼 수 있습니다. 이 경우 귀하의 계정에 대한 액세스 권한이있는 귀하의 Apps Script가 실행되며 결과 CSV가 귀하의 드라이브에 생성됩니다. 시간 기반 트리거에 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

관련 문제