2017-04-07 17 views
5

我有一个谷歌应用程序脚本可以在几个月内正常工作,并且它突然停止工作。我想知道Google是否不赞成我的代码的某些部分或某些东西。无法从Web应用程序调用Google脚本API函数(TypeError:无法读取未定义的属性“运行”)

这是链接到文件: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

我也有同样的问题。它影响所有的产品应用:( – 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> 

记住进行此更改后发布的Web应用程序的新版本。

更新:Google Apps脚本团队的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

我试图替换 '<脚本类型= “文本/ JavaScript的” SRC = “https://apis.google.com/js/api.js?onload=onApiLoad”>' 与 '<脚本type =“text/javascript”src =“https://www.google.com/jsapi”> ' 但没有工作。 –

相关问题