我有一个功能,可以将图像上传到 Google Drive 并在 Google Sheets 单元格中创建其链接。这是代码片段:
function upload(obj) {
var file = DriveApp.getFolderById("###").createFile(obj.upload);
var activeSheet = SpreadsheetApp.getActiveSheet();
var File_name = file.getName()
var value = 'hyperlink("' + file.getUrl() + '";"' + File_name + '")'
var activeSheet = SpreadsheetApp.getActiveSheet();
activeSheet.getRange("B2").setFormula(value)
return {
fileId: file.getId(),
mimeType: file.getMimeType(),
fileName: file.getName(),
};
}
function onChecked(e) {
if (e.range.getA1Notation() === 'I1' && e.value === 'TRUE') {
var html = HtmlService.createHtmlOutputFromFile('upload');
SpreadsheetApp.getUi().showModalDialog(html, 'Upload File');
}
}
我已经在
onChecked(e)
函数上设置了 onEdit 触发器,每当选中 cell I1 中的复选框时,都会触发此函数以在 Google Drive 中上传图像。它对我来说效果很好,但是当除我之外的任何其他用户选中此复选框时,它不会上传图像。这意味着 upload
功能未被任何其他用户执行。这是 upload.html
文件:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
</head>
<body>
<form> <!-- Modified -->
<div id="progress" ></div>
<input type="file" name="upload" id="file">
<input type="button" value="Submit" class="action" onclick="form_data(this.parentNode)" >
<input type="button" value="Close" onclick="google.script.host.close()" />
</form>
<script>
function form_data(obj){ // Modified
google.script.run.withSuccessHandler(closeIt).upload(obj);
};
function closeIt(e){ // Modified
console.log(e);
google.script.host.close();
};
</script>
</body>
</html>
总结一下这个问题,这个函数对我来说工作得很好,但是当其他用户尝试运行它时,它只执行
onChecked
函数,但 upload()
函数不运行。任何在这方面的帮助将不胜感激。
我相信您的目标如下。
onChecked
已作为 OnEdit 触发器安装。DriveApp.getFolderById("###")
的 var file = DriveApp.getFolderById("###").createFile(obj.upload);
文件夹。google.script.run
解析表单对象。所以,需要在Javascript端解析表单对象。当这些要点反映在你的脚本中时,就会变成如下所示。
请与用户分享您的
DriveApp.getFolderById("###")
的 var file = DriveApp.getFolderById("###").createFile(obj.upload);
文件夹。
请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。
请设置您的文件夹ID。
function upload(obj) {
var file = DriveApp.getFolderById("###").createFile(Utilities.newBlob(...obj));
var activeSheet = SpreadsheetApp.getActiveSheet();
var File_name = file.getName()
var value = 'hyperlink("' + file.getUrl() + '";"' + File_name + '")'
var activeSheet = SpreadsheetApp.getActiveSheet();
activeSheet.getRange("B2").setFormula(value)
return {
fileId: file.getId(),
mimeType: file.getMimeType(),
fileName: file.getName(),
};
}
function onChecked(e) {
if (e.range.getA1Notation() === 'I1' && e.value === 'TRUE') {
var html = HtmlService.createHtmlOutputFromFile('upload');
SpreadsheetApp.getUi().showModalDialog(html, 'Upload File');
}
}
// This is used to authorize the scopes of this script.
const test = _ => "ok";
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
</head>
<body>
<form> <!-- Modified -->
<div id="progress" ></div>
<input type="file" name="upload" id="file">
<input type="button" value="Submit" class="action" onclick="form_data(this.parentNode)" >
<input type="button" value="Close" onclick="google.script.host.close()" />
</form>
<script>
function form_data(obj){
const file = obj.upload.files[0];
const fr = new FileReader();
fr.onload = function(e) {
const obj = [[...new Int8Array(e.target.result)], file.type, file.name];
google.script.run.withSuccessHandler(closeIt).withFailureHandler(e => console.log(e.message)).upload(obj);
};
fr.readAsArrayBuffer(file);
};
function closeIt(e){
google.script.host.close();
};
</script>
</body>
</html>
请由非电子表格所有者的用户运行上述 Google Apps 脚本中的函数
test()
。这样,用户就可以对该脚本的范围进行授权。这样就可以上传文件了。
完成上述流程后,请选中“I1”复选框,并由非电子表格所有者的用户打开该对话框。并且,请上传文件。这样,文件就被放入
DriveApp.getFolderById("###")
文件夹中了。