Javascript 如何让Google文件选择器脚本在公开共享的Google工作表上启动?
我已经设置了一个可安装的触发器,当我的google工作表打开[showPicker()]时,它会启动google picker函数。任何人都可以通过url访问google表单 当我打开google工作表时,脚本运行良好,文件选择器显示在屏幕上。但是,当我登录到与我共享google工作表的另一个帐户时,脚本似乎没有运行,并且当打开电子表格时,文件选择器也没有显示 .GS文件Javascript 如何让Google文件选择器脚本在公开共享的Google工作表上启动?,javascript,google-apps-script,google-sheets-api,Javascript,Google Apps Script,Google Sheets Api,我已经设置了一个可安装的触发器,当我的google工作表打开[showPicker()]时,它会启动google picker函数。任何人都可以通过url访问google表单 当我打开google工作表时,脚本运行良好,文件选择器显示在屏幕上。但是,当我登录到与我共享google工作表的另一个帐户时,脚本似乎没有运行,并且当打开电子表格时,文件选择器也没有显示 .GS文件 function showPicker() { var html = HtmlService.createHtmlOut
function showPicker() {
var html = HtmlService.createHtmlOutputFromFile('Picker.html')
.setWidth(600)
.setHeight(425)
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
SpreadsheetApp.getUi().showModalDialog(html, 'Select CSV File');
}
function getOAuthToken() {
DriveApp.getRootFolder();
return ScriptApp.getOAuthToken();
}
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,text/csv')
//.setSelectFolderEnabled(true);
var picker = new google.picker.PickerBuilder()
.addView(docsView)
.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) {
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;
//Run Import CSV
google.script.run.withFailureHandler(onFailure)
.importCSVFromGoogleDrive(id);
//google.script.run.importCSVFromGoogleDrive(id);
google.script.host.close();
} else if (action == google.picker.Action.CANCEL) {
google.script.host.close();
}
}
function showError(message) {
document.getElementById('result').innerHTML = 'Error: ' + message;
}
function onFailure(error) {
var div = document.getElementById('output');
div.innerHTML = "ERROR: " + error.message;
}
</script>
</head>
<body>
<div>
<p id='result'></p>
<div id="output"></div>
</div>
<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
</body>
</html>
执行记录(使用其他谷歌账户):
只有电子表格的所有者才能触发html对话框。当其他用户打开您的电子表格时,将创建一个错误报告,说明他们无权调用无模式对话框。我猜这是一个安全功能 其他用户可以通过从菜单下拉菜单中选择来手动打开选择器
但是,您可以为打开电子表格的每个人触发Browser.msgBox()。显示其他帐户的浏览器控制台日志、stackdriver日志和执行记录。@TheMaster我已将上述问题中的日志附在后面,似乎与showModalDialog有关???您是否尝试从第二个帐户或仅通过触发器从编辑器运行代码?@user我与其他用户进行了讨论(我现在找不到),您无法向其他用户自动显示html。这在2016年之前是可能的?。我认为谷歌删除它是出于安全目的。最好是添加一个菜单项或类似的东西,通知用户打开选择器。还请注意,可安装触发器在您的帐户下运行,因此您的驱动器文件将显示给其他人。谢谢,请澄清:Browser.msgBox()只会为打开电子表格但无法运行任何其他功能(即提示文件选取器)的所有人触发一条对话框显示消息。除了Browser.msgBox(),您还可以使用(可能是更好的选项)SpreadsheetApp.getUi().alert()。
Error - Sep 2, 2019, 6:05:36 PM - You do not have permission to call showModalDialog at showPicker(Code:724)
[19-09-02 01:05:36:307 PDT] HtmlService.createHtmlOutputFromFile([Picker.html])[0 seconds]
[19-09-02 01:05:36:308 PDT] HtmlOutput.setWidth([600]) [0 seconds]
[19-09-02 01:05:36:308 PDT] HtmlOutput.setHeight([425]) [0 seconds]
[19-09-02 01:05:36:309 PDT] HtmlOutput.setSandboxMode([IFRAME]) [0 seconds]
[19-09-02 01:05:36:310 PDT] SpreadsheetApp.getUi() [0 seconds]
[19-09-02 01:05:36:315 PDT] Execution failed: You do not have permission to call showModalDialog (line 724, file "Code")
[0.004 seconds total runtime]