2017-04-07 13 views
5

मेरे पास Google Apps स्क्रिप्ट महीनों के लिए ठीक काम कर रही थी और अचानक काम करना बंद कर दिया। मैं सोच रहा हूं कि क्या Google ने मेरे कोड या कुछ के कुछ हिस्से को हटा दिया है।वेब ऐप से Google स्क्रिप्ट एपीआई फ़ंक्शंस को कॉल नहीं कर सकता (TypeError: अपरिभाषित की संपत्ति 'रन' नहीं पढ़ सकता)

इस फ़ाइल के लिए लिंक है: Click here to view Google Spreadsheet File

जब एक HTML फ़ाइल से एक गूगल स्क्रिप्ट फ़ंक्शन को कॉल करने की कोशिश कर गूगल स्क्रिप्ट कोड जाहिरा तौर पर विफल हो रहा है। यह कोड की रेखा है जो विफल रहता है।

google.script.run.importCSVData(id); 

लाइनों विफल रहता है और निम्न त्रुटि पकड़ता:

TypeError: Cannot read property 'run' of undefined

जैसा कि मैंने कहा, मैं महीनों के लिए इस कोड को ठीक काम कर रहा था और यह अचानक काम करना बंद कर।

(एफवाईआई ... इस कोड का उद्देश्य "आर्किवो प्लानो एडीएन" टैब में एक CSV फ़ाइल अपलोड करना है। इस कोड को चलाने के लिए, किसी को बस "आयातक आर्किवो सीएसवी" -> "आयातक आर्किवो" का चयन करना होगा। .. "। ऊपरी मेनू से जब फ़ाइल चुनने के लिए कहा, किसी भी .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

मैं बिल्कुल वैसा ही मुद्दा है। पुरानी रिपोर्ट की गई बग्स जो समान लगती हैं जो समस्या को यूआई पर बुलाए गए संवाद से जोड़ने के लिए उपयोग की जाती हैं। मैं कोई बदलाव नहीं करना चाहता हूं और आशा करता हूं कि समस्या दूर हो जाएगी। – Jonathon

+0

मुझे भी एक ही समस्या है। यह सभी प्रोडक्शन अनुप्रयोगों को प्रभावित करता है :( – Ritz

उत्तर

8

आप गूगल फ़ाइल चयनकर्ता गूगल एपीआई लोडर का उपयोग कर लोड करने के लिए की जरूरत है पुस्तकालय।

बदलें:

<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 स्क्रिप्ट टीम से एरिक कहता है "समस्या का कारण यह है कि जब पिकर एपीआई google.picker में लोड होता है, तो वर्तमान में यह google.script को ओवरराइट कर रहा है, इसलिए google.script.run() कॉल प्रारंभ में चूक गए। "

वे एक alternate solution पोस्ट किया है - मैन्युअल रूप से बनाए रखने और google.script बहाल जब पिकर एपीआई लोड हो रहा है:

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

धन्यवाद एक टन अमित .... इससे मदद मिली !!कोई विचार क्यों अचानक परिवर्तन – Ritz

+3

जब पुरानी विधि के बावजूद फ़ाइल पिकर लोड होता है, तो Google ऑब्जेक्ट केवल पिकर एपीआई को इंगित करता है और इसलिए google.script API फ़ंक्शन काम नहीं करते हैं। –

+0

मैं जगह की कोशिश की ' साथ ' लेकिन काम नहीं किया। –

संबंधित मुद्दे