2017-04-07 1 views
5

Google Apps 스크립트를 몇 달 동안 사용하면 갑자기 작동이 중지되었습니다. Google이 내 코드 또는 일부의 일부를 사용 중단할지 궁금합니다. 웹 응용 프로그램에서 Google Script API 함수를 호출 할 수 없습니다. (TypeError : 정의되지 않은 'run'속성을 읽을 수 없습니다.)

는 파일에 대한 링크입니다 : Click here to view Google Spreadsheet File HTML 파일에서 구글 스크립트 함수를 호출하려고 할 때 구글 스크립트 코드는 분명히 실패

. 이것은 실패한 코드 행입니다.

google.script.run.importCSVData(id); 

선은 실패하고 다음과 같은 오류를 잡는다 : 내가 말했듯이

TypeError: Cannot read property 'run' of undefined

, 나는 달 동안 제대로 작동이 코드를했고 갑자기 작동을 멈췄습니다.

(이 코드의 목적은 CSV 파일을 "Archivo Plano ADN"탭에 업로드하는 것입니다.이 코드를 실행하려면 "Importar Archivo CSV"-> "Importar Archivo"를 선택해야합니다. .. ". 상단 메뉴에서 파일을 선택하라는 메시지가 표시되면, 어떤 .csv 파일을 선택 CSV 파일에 의해 구분되어야합니다.)


내 구글 스프레드 시트 파일은 세 개의 코드 파일이 있습니다 ("Code.gs "

: "CodeImport.gs"와 "Picker.html")

내가 당신에게 각각의 코드를 제공하자 Code.gs :

function onOpen() { 

    var me = Session.getEffectiveUser(); 
    if (me.getEmail() == "[email protected]") { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Protected Ranges') 
    .addItem('Remove Protection', 'menuItem1') 
    .addItem('Copy Protected Ranges To Another Sheet', 'menuItem2') 
    .addItem('Copy SM Protected Ranges to all SA sheets', 'menuItem3') 
    .addToUi(); 

    ui.createMenu('Importar Archivo CSV') 
     .addItem('Importar Archivo...', 'showPicker') 
     .addToUi(); 

    ui.cre 
    } else { 
    SpreadsheetApp.getUi() // Or DocumentApp or FormApp. 
     .createMenu('Importar Archivo CSV') 
     .addItem('Importar Archivo...', 'showPicker') 
     .addToUi(); 
    } 

} 

CodeImport.gs :

function importCSVData(id) { 
try { 
    var file = DriveApp.getFileById(id); 
    var csvData = Utilities.parseCsv(file.getBlob().getDataAsString("ISO-8859-1"),";"); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archivo Plano ADN"); 
    sheet.getRange("A:U").clear(); 
    sheet.getRange("G:G").setNumberFormat('@[email protected]'); 
    Logger.log("yes"); 

    sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); 

    file.setTrashed(true); 

    SpreadsheetApp.getUi().alert("Archivo Importado con éxito"); 

    } catch (e) { 
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(), "Error report jaja - sonríele a la vida!", 
     "\r\nMessage: " + e.message 
     + "\r\nFile: " + e.fileName 
     + "\r\nLine: " + e.lineNumber); 
    } 
} 

function showPicker() { 
    var html = HtmlService.createHtmlOutputFromFile('Picker.html') 
     .setWidth(600) 
     .setHeight(425) 
     .setSandboxMode(HtmlService.SandboxMode.IFRAME); 
    SpreadsheetApp.getUi().showModalDialog(html, 'Select File'); 
} 

function getOAuthToken() { 
    DriveApp.getRootFolder(); 
    return ScriptApp.getOAuthToken(); 
} 

function finishedImport() { 
    SpreadsheetApp.getUi().alert("Archivo importado exitosamente"); 
} 

function senderror(e) { 
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(), "Error report jaja - sonríele a la vida!", 
     "\r\nMessage: " + e.message 
     + "\r\nFile: " + e.fileName 
     + "\r\nLine: " + e.lineNumber); 
} 

그리고 마지막으로, Picker.html 파일 :

<!DOCTYPE html> 
<html> 
<head> 
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css"> 
    <script type="text/javascript"> 
    var DIALOG_DIMENSIONS = { 
     width: 600, 
     height: 425 
    }; 
    var pickerApiLoaded = false; 

    function onApiLoad() { 
     gapi.load('picker', { 
      'callback': function() { 
       pickerApiLoaded = true; 
      } 
     }); 
     google.script.run.withSuccessHandler(createPicker) 
      .withFailureHandler(showError).getOAuthToken(); 
    } 

    function createPicker(token) { 

     if (pickerApiLoaded && token) { 

      //var docsView = new google.picker.DocsView() 
       //.setIncludeFolders(true) 
       //.setMimeTypes('application/vnd.google-apps.folder') 
       //.setSelectFolderEnabled(true); 

      var uploadDocsView = new google.picker.DocsUploadView() 
       .setIncludeFolders(true) 
       //.setMimeTypes('application/vnd.google-apps.folder') 
       //.setSelectFolderEnabled(true); 

      var picker = new google.picker.PickerBuilder() 
       //.addView(docsView) 
       .addView(uploadDocsView) 
       //.setAppId("AIzaSyCZDa4JKKIOv2AF3QyrG8DnVOXmz27054o") 
       .enableFeature(google.picker.Feature.NAV_HIDDEN) 
       .hideTitleBar() 
       .setSize(DIALOG_DIMENSIONS.width - 2, DIALOG_DIMENSIONS.height - 2) 
       .setOAuthToken(token) 
       .setCallback(pickerCallback) 
       .setOrigin('https://docs.google.com') 
       .build(); 

      picker.setVisible(true); 

     } else { 
      showError('Unable to load the file picker.'); 
     } 
    } 

    /** 
    * A callback function that extracts the chosen document's metadata from the 
    * response object. For details on the response object, see 
    * https://developers.google.com/picker/docs/result 
    * 
    * @param {object} data The response object. 
    */ 
    function pickerCallback(data) { 
    try { 
     var action = data[google.picker.Response.ACTION]; 
     if (action == google.picker.Action.PICKED) { 
      var doc = data[google.picker.Response.DOCUMENTS][0]; 
      var id = doc[google.picker.Document.ID]; 
      // Show the ID of the Google Drive folder 
      //document.getElementById('result').innerHTML = id; 
      document.getElementById('result').innerHTML = "Importando..." 
      google.script.run.importCSVData(id); 
      //google.script.run.deleteImportedFile(id); 
      google.script.host.close(); 
     } else if (action == google.picker.Action.CANCEL) { 
     //document.getElementById('result').innerHTML = "Cerrando1..." 
      google.script.host.close(); 
     //document.getElementById('result').innerHTML = "Cerrando2..." 

     } 
     } catch (e) { 
      document.getElementById('result').innerHTML = e; 
      google.script.run.senderror(e); 
     } 
    } 

    function showError(message) { 
     document.getElementById('result').innerHTML = 'Error: ' + message; 
    } 
    </script> 
</head> 

<body> 
    <div> 
     <p id='result'></p> 
    </div> 
    <script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script> 
</body> 
</html> 
+0

을 나는 정확히 같은 문제가 있습니다. 비슷한 문제가있는 이전에보고 된 버그가 있으며 UI에서 호출 된 대화 상자에 문제를 연결하는 데 사용됩니다. 나는 어떤 변화도 일으키지 않아도되고 문제가 사라지기를 희망한다. – Jonathon

+0

나도 같은 문제가 있습니다. 그 모든 prodction 응용 프로그램을 effecting : ( – Ritz

답변

8

당신은 구글 피커가 구글의 API 로더를 사용하여 파일로드해야합니다 도서관.

은 교체 :

<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script> 

로 :

<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script>google.load("picker", "1", {callback:function(){pickerApiLoaded =!0}});</script> 

이 변경 한 후 웹 응용 프로그램의 새 버전을 게시해야합니다.

업데이트 : Google Apps Script 팀의 Erik은 "Picker API가 google.picker로로드되면 현재 google.script를 덮어 쓰고 있으므로 google.script.run() 호출이 시작됩니다. 실패."

는 그들은는 alternate solution 게시 한 - 수동으로 보존하고 선택기 API로드 할 때 google.script을 복원

window.script = google.script; 
gapi.load('picker', '1', {callback: function() { 
    google.script = window.script; 
    // ... 
}}); 
+0

고마워요 톤 아미트 ....이 도움이 !!왜 갑작스런 변경이 일어 났는지에 대한 아이디어 – Ritz

+3

이전 방법으로 파일 선택 도구가로드되면 Google 객체는 Picker API 만 가리키고 따라서 google.script API 함수는 작동하지 않습니다. –

+0

내가 교체 시도 '<스크립트 유형 = "텍스트/자바 스크립트"SRC = "https://apis.google.com/js/api.js?onload=onApiLoad">' 와 '<스크립트 ' 하지만 작동하지 않았습니다. –

관련 문제