Ошибка недопустимого исходного значения API Google Picker

#javascript #google-apps-script #google-cloud-platform #google-picker

#javascript #google-apps-script #google-облачная платформа #google-picker

Вопрос:

Сегодня Google Picker перестал работать в моем дополнении Google Sheets без каких-либо изменений в коде. Ошибка в модальном диалоге гласит:

Недопустимое исходное значение.

Ошибки в консоли:

Не удалось выполнить ‘postMessage’ в ‘DOMWindow’: предоставлено целевое исходное значение (‘https://docs.google.com ‘) не соответствует источнику окна получателя (‘https://n-a6p4dqsl ***d6wq-0lu-script.googleusercontent.com ‘)

удаление postMessage .. было из неожиданного окна

удаление postMessage .. было из неожиданного окна

Недопустимый заголовок ‘X-Frame-Options’, встречающийся при загрузке ‘https://docs.google.com/picker ?protocol=gadgetsamp;origin=https://docs.google.com/amp;sdr=trueamp;titleamp;oauth_token=<oathToken>amp;developerKey=<developerKey>amp;hostId=n-a6p4dq***d6wq-0lu-script.googleusercontent.comamp;relayUrl=https://n-a6p4dq***d6wq-0lu-script.googleusercontent.com/favicon.icoamp;nav=((«documents»,null,{«selectFolder»:true,»parent»:»root»}),(«documents»,null,{«dr»:true,»includeFolders»:true}))amp;rpcService=qhurmoc5w4l7amp;rpctoken=xssf8g42xc2amp;ThirdParty=true#rpctoken=xssf8g42xc2’: ‘РАЗРЕШИТЬ-ИЗ https://docs.google.com /’ не является признанной директивой. Заголовок будет проигнорирован.

Возможно, ошибка связана с этой строкой кода, где я делаю setOrigin() :

         var picker = new google.picker.PickerBuilder()
            .addView(driveView)
            .addView(drivesView)
            .hideTitleBar()
            .setOAuthToken(token)
            .setDeveloperKey(DEVELOPER_KEY)
            .setCallback(pickerCallback)
        --> .setOrigin(google.script.host.origin)
            .setSize(DIALOG_DIMENSIONS.width - 2,
                DIALOG_DIMENSIONS.height - 2)
            .build();
 

Но эта строка взята непосредственно из документации API Google Picker и раньше работала правильно. Если я изменяю google.script.host.origin , это возвращается https://docs.google.com как url to https://n-a6p4dqsl***6wcd6wq-0lu-script.googleusercontent.com , я получаю ту же ошибку и новую, так что это не так.

Я также не могу добавить это как авторизованный источник javascript в проекте GCP, поскольку он возвращает следующую ошибку:

Недопустимый источник: используется запрещенный домен

(Это имело место некоторое время)

Это похоже на новую ошибку, и я не смог найти ответ ни в системе отслеживания проблем Google, ни в StackOverflow.

Кто-нибудь тоже сталкивался с этим или имеет представление о том, как с этим можно справиться?

Комментарии:

1. Та же проблема для нас и с надстройкой. Я считаю, что строка setOrigin преобразуется в директиву X-Frame-Options с использованием заголовка ALLOW-FROM, который теперь игнорируется, что приводит к появлению сообщения об ошибке недопустимого исходного значения в качестве ответа. Я только что узнал в документации X-Frame-Options, что ALLOW-FROM — это устаревшая директива, которая больше не работает в современных браузерах. Не используйте его … Возможно, они только вчера начали его удалять. Я предполагаю, что это может быть фактической причиной

Ответ №1:

В конце концов, единственный способ решить эту проблему — удалить завершающую косую черту после

От

docs.google.com/

Для

docs.google.com

Наоборот,

Google.script.host.orgin выдает «https://docs.google.com /» что вызывает ошибку. Следовательно, вам необходимо жестко закодировать как

«https://docs.google.com »

Недавно Google внес некоторые изменения, которые могли вызвать эту проблему.

Обновить

Вы можете использовать эту функцию — и вызвать — ...... setOrigin(getOrigin())

 function getOrigin() {
    var url = google.script.host.origin;
    return url.substr(url.length - 1) === "/" ? url.substr(0, url.length - 1) : url;
}
 

Комментарии:

1. Это сработало для меня.. Чтобы сделать это более понятным, это новое жестко закодированное значение переходит в setOrigin() вызов PickerBuilder() вместо google.script.host.origin значения, которое есть в документах.

2. Миллион благодарностей, это сработало! Для тех, кто не хочет жестко кодировать URL-адрес, вы можете использовать следующую функцию для удаления косой черты в конце: ` функция stripSlash(url) { возвращает url.substr(url.length — 1) === «/» ? url.substr(0, url.length — 1): url; } `

Ответ №2:

Решение для использования в iframe

https://developers.google.com/apps-script/guides/dialogs#code.gs_2

code.gs

          function showPicker() {
          var html = HtmlService.createHtmlOutputFromFile('dialog.html')
              .setWidth(600)
              .setHeight(425)
              .setSandboxMode(HtmlService.SandboxMode.IFRAME);
          SpreadsheetApp.getUi().showModalDialog(html, 'Select a file');
    }


.setSandboxMode(HtmlService.SandboxMode.IFRAME); 
//can be removed or replaced with
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
 

dialog.html

 function getOrigin() {
        var url = "https://mydomain.name/";
        return url.substr(url.length - 1) === "/" ? url.substr(0, url.length - 1) : url;
    }
 

Обновить

Теперь он работает без каких-либо изменений в коде.