google apps script - custom - No se puede llamar a las funciones de la API de Google Script desde la aplicaciĆ³n web(TypeError: no se puede leer la propiedad ''ejecutar'' de indefinido)
msgbox google script (1)
Tenía un script de aplicaciones de google funcionando bien durante meses y de repente dejó de funcionar. Me pregunto si Google desaprobó alguna parte de mi código o algo así.
Este es el enlace al archivo: haga clic aquí para ver el archivo de la hoja de cálculo de Google
El código de script de google aparentemente falla cuando intenta llamar a una función de script de Google desde un archivo HTML. Esta es la línea de código que falla.
google.script.run.importCSVData(id);
Las líneas fallan y detecta el siguiente error:
TypeError: no se puede leer la propiedad ''run'' de undefined
Como dije, tenía este código funcionando bien durante meses y de repente dejó de funcionar.
(Para su información ... El propósito de este código es cargar un archivo CSV en la pestaña "Archivo Plano ADN". Para ejecutar este código, simplemente debe seleccionar "Importar Archivo CSV" -> "Importar Archivo ..." de el menú superior. Cuando se le solicite seleccionar el archivo, seleccione cualquier archivo .csv. El archivo csv debe estar separado por;)
Mi archivo de hoja de cálculo de Google tiene tres archivos de código ("Code.gs", "CodeImport.gs" y "Picker.html")
Déjame darte el código de cada uno:
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(''@STRING@'');
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);
}
Y finalmente, el archivo 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>
Debe cargar el selector de archivos de Google utilizando la biblioteca del cargador de la API de Google.
Reemplazar:
<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
con:
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>google.load("picker", "1", {callback:function(){pickerApiLoaded =!0}});</script>
Recuerde publicar una nueva versión de la aplicación web después de realizar este cambio.
Actualización: Erik, del equipo de Google Apps Script, dice que "la causa del problema es que cuando la API Picker se carga en google.picker, actualmente está sobrescribiendo google.script, por lo que las llamadas a google.script.run () comienzan a fallar".
Han publicado una solución alternativa : conserva y restaura manualmente google.script al cargar la API de selector:
window.script = google.script;
gapi.load(''picker'', ''1'', {callback: function() {
google.script = window.script;
// ...
}});