2017-04-07 15 views
5

Birkaç ay boyunca iyi çalışan bir google apps komut dosyası çalıştırdım ve aniden çalışmayı bıraktım. Google'ın kodumun bir kısmını ya da bir şeyden mahrum kaldığını merak ediyorum. Web App'den Google Script API İşlevleri çağrlanılamıyor (TypeError: undefined öğesinin 'run' özelliği okunamıyor)

Bu

dosyaya link: Click here to view Google Spreadsheet File bir HTML dosyasından bir google komut işlevi çağırmak çalışırken google script kodunu görünüşte başarısız olup

. Bu, başarısız olan kod satırı.

google.script.run.importCSVData(id); 

hatları başarısız olur ve aşağıdaki hata yakalar: Dediğim gibi

TypeError: Cannot read property 'run' of undefined

, aylardır iyi çalışıyor bu kodu vardı ve aniden çalışmayı durdurdu.

(FYI ... Bu kodun amacı "Archivo Plano ADN" sekmesine bir CSV dosyası yüklemektir.Bu kodu çalıştırmak için "Importar Archivo CSV" -> "Importar Archivo" seçilmelidir. ..". üst menüden dosyayı seçmek istendiğinde herhangi .csv dosyasını seçin csv dosyası ile ayrılmalıdır;.)


My Google E-Tablo dosyası üç kod dosyaları vardır ('Code.gs'

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

sana her birinin kodunu verelim 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); 
} 

Ve nihayet, Picker.html dosyasını:

<!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

ben de aynı sorun var. Sorunu, UI'de çağrılan diyaloglara bağlamak için kullanılan benzer görünen eski hatalar vardır. Herhangi bir değişiklik yapmamayı ve problemin ortadan kalkmasını umarım. – Jonathon

+0

Ben de aynı sorunu yaşıyorum. Onun tüm prodction uygulamalarını etkilemesi :( – Ritz

cevap

8

Google Seçici Google API Loader kullanarak File yüklemeniz gerekir kütüphane.

değiştirin:

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

ile:

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

bu değişikliği yaptıktan sonra web uygulaması yeni bir sürümünü yayınlamayı unutmayın.

Güncelleme: Google Apps Komut Dosyası ekibinden Erik, "sorunun nedeni, Picker API'sının google.picker'a yüklendiğinde, şu anda google.script'in üzerine yazılmasıdır, bu nedenle google.script.run() çağrıları başlar başarısız."

Onlar alternate solution attılar - elle korumak ve Seçici API yüklerken google.script geri yükleyin:

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

Teşekkürler bir ton Amit .... bu yardımcı oldu!Neden ani değişiklik olursa – Ritz

+3

Dosya seçici eski yöntemle yüklendiğinde, google nesnesi yalnızca Seçici API'sine işaret eder ve bu nedenle google.script API işlevleri çalışmaz. –

+0

Ben yerine çalıştı '' ile ' ' ancak çalışmadı. –

İlgili konular