Невозможно вызвать функции API скриптов Google из веб-приложения (ошибка типа: невозможно прочитать свойство run из undefined)

У меня был сценарий приложений Google, работающий отлично в течение нескольких месяцев, и он внезапно перестал работать. Мне интересно, не устарел ли Google какая-то часть моего кода или что-то в этом роде.

Это ссылка на файл: Нажмите здесь, чтобы просмотреть файл электронной таблицы Google

Код сценария Google, по-видимому, дает сбой при попытке вызвать функцию сценария Google из файла HTML. Эта строка кода не работает.

google.script.run.importCSVData(id);

Строки терпят неудачу и ловят следующую ошибку:

Ошибка типа: не удается прочитать свойство 'run' из неопределенного

Как я уже сказал, у меня этот код работал отлично в течение нескольких месяцев, и он внезапно перестал работать.

(К сведению... Цель этого кода - загрузить файл CSV на вкладку "Архив ADV Archivo Plano". Чтобы запустить этот код, нужно просто выбрать "Importar Archivo CSV" -> "Importar Archivo..." из верхнее меню. Когда будет предложено выбрать файл, выберите любой файл.csv. Файл CSV должен быть разделен;)


В моем файле электронных таблиц Google есть три файла кода ("Code.gs", "CodeImport.gs" и "Picker.html").

Позвольте мне дать вам код каждого:

Code.gs:

function onOpen() {

  var me = Session.getEffectiveUser();
  if (me.getEmail() == "alejandro.sardi@crusardi.net") {
    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);
 }

И, наконец, файл 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>

1 ответ

Вам нужно загрузить Google File Picker, используя библиотеку Google API Loader.

Заменить:

<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 говорит, что "причина проблемы в том, что когда API Picker загружается в google.picker, он в настоящее время перезаписывает google.script, поэтому вызовы google.script.run() начинают давать сбои".

Они опубликовали альтернативное решение - вручную сохраните и восстановите google.script при загрузке Picker API:

window.script = google.script;
gapi.load('picker', '1', {callback: function() {
  google.script = window.script;
  // ...
}});
Другие вопросы по тегам