我正在開發一個最終將作為附加組件發布的獨立腳本。它將有一個側邊欄用戶與之互動,從那里他們可以啟動谷歌檔案選擇器來上傳報告進行處理。我之前一直在尋找一種讓側邊欄知道檔案選擇器已完成的方法。我成功復制了這個答案,并讓檔案選擇器對話框將訊息發送回側邊欄,表明它已完成。但是,控制臺充滿了一些錯誤和警告,我想知道是否應該關注這些錯誤和警告。錯誤是:
嘗試從 URL 為“https://***.googleusercontent.com/userCodeAppPanel”的框架中啟動源為“https://docs.google.com”的框架的導航是不安全的。嘗試導航頂級視窗的框架被沙盒化,但未設定“allow-top-navigation”或“allow-top-navigation-by-user-activation”標志。
DOMException:阻止來自“https://###.googleusercontent.com”的框架訪問跨源框架。在 findSideBar (https://###.googleusercontent.com/userCodeAppPanel:80:18) at w0.pickerCallback [as Fb] (https://###.googleusercontent.com/userCodeAppPanel:98:11) at w0 ._.h.iV ( https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en.uAzDleg2hnU.O/m=picker/rt=j/sv =1/d=1/ed=1/am=AQ/rs=AGLTcCMT6b3QcRI88QolvkcdUjC8YnoTvA/cb=gapi.loaded_0:740:393 ) 在 d ( https://apis.google.com/_/scs/apps-static/ _/js/k=oz.gapi.en.uAzDleg2hnU.O/m=picker/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCMT6b3QcRI88QolvkcdUjC8YnoTvA/cb=gapi.loaded_0: 215:143 ) 在 b (https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en.uAzDleg2hnU.O/m=picker/rt=j/sv=1/d=1/ ed=1/am=AQ/rs=AGLTcCMT6b3QcRI88QolvkcdUjC8YnoTvA/cb=gapi.loaded_0:210:1 )
拒絕獲取不安全的標頭“X-HTTP-Status-Code-Override”
然而,我之前看到的第一個錯誤是新的,并且與將訊息從檔案選擇器對話框發送回側邊欄有關。
值得一提的是,一切仍然有效。我的問題主要是這些錯誤是我應該擔心的,在附加組件發布之前進行審核時它們會導致問題嗎,我該如何糾正它們?
我已經在我的側邊欄創建代碼、選擇器創建和將訊息從選擇器發送到側邊欄的相關代碼中包含了下面的代碼。
側邊欄創建:
function buildSidebar(type) {
hideColumns();
hideRows();
hideSheets();
if(type == 'setup' || checkSetup()) {
var html = HtmlService.createTemplateFromFile('SidebarSetupHTML')
.evaluate()
.setTitle('Test');
} else {
var html = HtmlService.createTemplateFromFile('SidebarMainHTML')
.evaluate()
.setTitle('Test');
}
SpreadsheetApp.getUi().showSidebar(html);
}
選擇器創建:
function showPicker() {
var html = HtmlService.createHtmlOutputFromFile('PickerHTML.html')
.setWidth(600)
.setHeight(425)
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
SpreadsheetApp.getUi().showModalDialog(html, 'Select Report(s)');
}
選擇器訊息代碼:
function pickerCallback(data) {
var action = data[google.picker.Response.ACTION];
if (action == google.picker.Action.PICKED) {
(function findSideBar(limit) {
let f = window.top.frames;
for (let i = 0; i < limit; i) {
try {
if (
f[i] /*/iframedAppPanel*/ &&
f[i].length &&
f[i][0] && //#sandboxFrame
f[i][0][0] && //#userHtmlFrame
window !== f[i][0][0] //!== self
) {
console.info('Sidebar found');
var sidebar = f[i][0][0];
sidebar.modalDone('PICKED'); //Modal has finished
console.log('Message sent');
google.script.host.close();
}
} catch (e) {
console.error(e);
continue;
}
}
})(10);
}
}
側邊欄啟動選擇器并接收訊息:
function testPicker() {
google.script.run.withSuccessHandler(pickerResponse).showPicker();
}
function pickerResponse(e) {
(async () => {
let receiver = new Promise((res, rej) => {
window.modalDone = res;
});
var message = await receiver;
console.log('message received');
if(message == 'PICKED' || message == "NOT_PICKED") {
console.log(message);
}
//Do what you want here
})();
}
uj5u.com熱心網友回復:
當我看到您的腳本時,我認為您問題的原因可能是 if 陳述句之后的回圈是true. 例如,當 if 陳述句為 時true,放在break最后一行如何?那么,下面的修改如何呢?
從:
if (
f[i] /*/iframedAppPanel*/ &&
f[i].length &&
f[i][0] && //#sandboxFrame
f[i][0][0] && //#userHtmlFrame
window !== f[i][0][0] //!== self
) {
console.info('Sidebar found');
var sidebar = f[i][0][0];
sidebar.modalDone('PICKED'); //Modal has finished
console.log('Message sent');
google.script.host.close();
}
到:
if (
f[i] /*/iframedAppPanel*/ &&
f[i].length &&
f[i][0] && //#sandboxFrame
f[i][0][0] && //#userHtmlFrame
window !== f[i][0][0] //!== self
) {
console.info('Sidebar found');
var sidebar = f[i][0][0];
sidebar.modalDone('PICKED'); //Modal has finished
console.log('Message sent');
google.script.host.close();
break; // <--- Added
}
筆記:
當我在 Google Docs 上測驗自定義對話框的以下示例腳本時(例如,它是 Google 電子表格),
<script>
google.script.host.close();
alert("ok");
</script>
我確認警報視窗已打開,并且對話框已關閉。所以我認為這google.script.host.close()可能適用于異步程序。
例如,當google.script.run使用高工藝成本時,
<script>
google.script.host.close();
google.script.run.withSuccessHandler(_ => alert("ok2")).myFunction();
alert("ok1");
</script>
似乎myFunction()和alert("ok2")沒有運行,因為對話框在 run 之前關閉myFunction(),而 whilealert("ok1")運行。另一方面,當行程成本較低時,似乎google.script.host.close()運行了之后的腳本。
從這些情況來看,作為一種嘗試,我建議break在google.script.host.close()OP 的問題之后添加。
參考:
- 回圈和迭代
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327414.html
標籤:javascript html 谷歌应用程序脚本 网络应用程序 谷歌选择器
