You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在安卓端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>

部署说明

  1. 将上述代码保存后,点击Google Apps Script编辑器的「部署」→「新部署」
  2. 选择类型为「Web应用」,设置「执行权限」为「以我自己的身份执行」,「访问权限」为「任何人,甚至匿名」
  3. 复制生成的Web App URL,替换到Code.gs中的webAppUrl变量

方案2:Google Forms联动Sheets

  1. 创建Google Form,添加「文件上传」字段并限制仅允许图片上传,设置文件保存到指定Drive文件夹
  2. 将Form的响应链接到目标Sheets的新工作表
  3. 编写onFormSubmit触发器脚本,当有新响应时自动提取图片链接并写入原工作表的对应单元格

注意事项

  • Web App方案需确保Drive目标文件夹权限允许脚本写入
  • 安卓用户点击自定义菜单后,复制链接到浏览器即可完成上传,上传完成后链接会自动同步到表格

内容的提问来源于stack exchange,提问作者user12736831

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:05:26