如何在安卓端Google Sheets应用中通过触发器运行图片上传脚本?
安卓端Google Sheets实现图片上传功能的解决方案
问题说明
我在网页端Google Sheets中,借助@Tanaike的方案实现了图片上传功能:通过onEdit()触发器运行脚本,弹出对话框让用户上传图片至Google Drive,图片链接会自动写入表格单元格。该脚本在Chrome浏览器中运行正常,但在安卓端Google Sheets应用中,触发器虽能触发脚本,却无法弹出上传对话框。需要找到安卓端可用的图片上传实现方式。
现有代码(网页端可用)
Code.gs
function addImage() { var filename = 'Row'; var htmlTemp = HtmlService.createTemplateFromFile('Index'); htmlTemp.fName = filename; htmlTemp.position = 2; var html = htmlTemp.evaluate().setHeight(96).setWidth(415); var ui = SpreadsheetApp.getUi(); ui.showModalDialog(html, '上传图片'); } function upload(obj, rowNum) { var newFileName = obj[2]; var blob = Utilities.newBlob(...obj); var upFile = DriveApp.getFolderById('[folderid]').createFile(blob).setName(newFileName); var fileUrl = upFile.getUrl(); var urlCell = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(rowNum, 5); urlCell.setValue('=HYPERLINK("' + fileUrl + '","查看图片")'); return "完成"; }
Index.html
<!DOCTYPE html> <html> <head> <base target="_center"> <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css"> <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script> </head> <body> <form id="myForm"> 请上传下方图片。<br /><br /> <input type="hidden" name="fname" id="fname" value="<?= fName ?>"/> <input type="hidden" name="position" id="position" value="<?= position ?>"/> <input type="file" name="file" id="file" accept="image/jpeg,.pdf" /> <input type="button" value="提交" class="action" onclick="formData(this.parentNode)" /> <input type="button" value="关闭" onclick="google.script.host.close()" /> </form> <script> // 禁用默认提交行为 window.onload=func1; function func1() { document.getElementById('myForm').addEventListener('submit', function(event) { event.preventDefault(); }); } function formData(obj) { const file = obj.file.files[0]; const fr = new FileReader(); fr.readAsArrayBuffer(file); fr.onload = f => google.script.run.withSuccessHandler(closeIt).upload([[...new Int8Array(f.target.result)], file.type, obj.fname.value], obj.position.value); } function closeIt(e){ console.log(e); google.script.host.close(); }; </script> </body> </html>
安卓端适配方案
安卓端Google Sheets应用不支持SpreadsheetApp.getUi().showModalDialog()弹出HTML对话框,这是核心限制。以下是两种可行的替代方案:
方案1:基于Web App的移动端上传页面
将上传逻辑封装为Web App,通过自定义菜单引导安卓用户在浏览器中完成上传,上传完成后自动将链接写入单元格。
修改后的Code.gs
// Web App入口函数 function doGet(e) { var rowNum = e.parameter.row; var htmlTemp = HtmlService.createTemplateFromFile('MobileUpload'); htmlTemp.rowNum = rowNum; return htmlTemp.evaluate().setTitle('上传图片'); } // 保留原上传逻辑 function upload(obj, rowNum) { var newFileName = `Row_${rowNum}_${new Date().getTime()}`; var blob = Utilities.newBlob(...obj); var upFile = DriveApp.getFolderById('[folderid]').createFile(blob).setName(newFileName); var fileUrl = upFile.getUrl(); var urlCell = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(rowNum, 5); urlCell.setValue(`=HYPERLINK("${fileUrl}","查看图片")`); return "上传完成"; } // 添加自定义菜单(安卓端可触发) function onOpen() { SpreadsheetApp.getUi() .createMenu('图片上传') .addItem('上传到当前行', 'showUploadLink') .addToUi(); } // 显示Web App链接 function showUploadLink() { var sheet = SpreadsheetApp.getActiveSheet(); var rowNum = sheet.getActiveRange().getRow(); // 替换为你的Web App部署URL var webAppUrl = "https://script.google.com/macros/s/你的Web AppID/exec?row=" + rowNum; SpreadsheetApp.getUi().alert(`请复制链接到浏览器打开上传:\n${webAppUrl}`); }
MobileUpload.html(移动端适配)
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { padding: 20px; font-family: sans-serif; } .form-group { margin-bottom: 20px; } button { padding: 12px 24px; background: #1a73e8; color: white; border: none; border-radius: 4px; font-size: 16px; } #message { margin-top: 20px; color: #2ecc71; } </style> </head> <body> <h3>上传图片到第 <?= rowNum ?> 行</h3> <form id="uploadForm"> <div class="form-group"> <input type="file" name="file" accept="image/*" required> </div> <button type="submit">开始上传</button> </form> <div id="message"></div> <script> document.getElementById('uploadForm').addEventListener('submit', function(e) { e.preventDefault(); const file = this.file.files[0]; const fr = new FileReader(); fr.readAsArrayBuffer(file); fr.onload = function(f) { google.script.run .withSuccessHandler(function(msg) { document.getElementById('message').textContent = msg; }) .upload([[...new Int8Array(f.target.result)], file.type, `Row_<?= rowNum ?>`], <?= rowNum ?>); }; }); </script> </body> </html>
部署说明
- 将上述代码保存后,点击Google Apps Script编辑器的「部署」→「新部署」
- 选择类型为「Web应用」,设置「执行权限」为「以我自己的身份执行」,「访问权限」为「任何人,甚至匿名」
- 复制生成的Web App URL,替换到Code.gs中的
webAppUrl变量
方案2:Google Forms联动Sheets
- 创建Google Form,添加「文件上传」字段并限制仅允许图片上传,设置文件保存到指定Drive文件夹
- 将Form的响应链接到目标Sheets的新工作表
- 编写
onFormSubmit触发器脚本,当有新响应时自动提取图片链接并写入原工作表的对应单元格
注意事项
- Web App方案需确保Drive目标文件夹权限允许脚本写入
- 安卓用户点击自定义菜单后,复制链接到浏览器即可完成上传,上传完成后链接会自动同步到表格
内容的提问来源于stack exchange,提问作者user12736831
相关产品推荐
相关产品推荐

