No se pueden llamar las funciones de la API de Google Script desde la aplicación web (TypeError: no se puede leer la propiedad 'run' de undefined)

Tuve un script de aplicaciones de Google que funcionó 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 hoja de cálculo de Google

Aparentemente, el código de script de google 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);

La línea falla y detecta el siguiente error:

TypeError: no se puede leer la propiedad 'run' de undefined

Como dije, tuve 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 un 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>

Respuestas a la pregunta(1)

Su respuesta a la pregunta