#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;
}
Обновить
Теперь он работает без каких-либо изменений в коде.