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

能否在Google Sheets插入图片并通过App Script将其均分至指定单元格?

可以实现!用Google Apps Script将图片分割到指定单元格

完全可行,通过Google Apps Script结合前端Canvas API,就能把插入到Google Sheets的图片均匀切割并分配到指定数量的单元格中。以下是具体实现思路和代码:

核心逻辑

  1. 提取目标图片的原始尺寸和二进制数据(Blob)
  2. 根据指定的分割行列数,计算每个小切片的尺寸
  3. 借助Canvas API切割原图,生成对应数量的小图片Blob
  4. 将每个小图片插入到Sheet的对应单元格,并调整单元格大小适配图片

实现代码

function splitImageToCells() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const targetImage = sheet.getImages()[0]; // 获取Sheet中第一张图片,可根据索引调整目标图片
  const splitRows = 3; // 自定义分割行数
  const splitCols = 3; // 自定义分割列数
  const startCell = sheet.getRange("A1"); // 分割后图片插入的起始单元格

  // 获取图片基础信息
  const imageUrl = targetImage.getUrl();
  const imageWidth = targetImage.getWidth();
  const imageHeight = targetImage.getHeight();

  // 计算每个切片的尺寸
  const sliceWidth = imageWidth / splitCols;
  const sliceHeight = imageHeight / splitRows;
  const startRow = startCell.getRow();
  const startCol = startCell.getColumn();

  // 调用Canvas处理图片切割(App Script本身无Canvas,需借助HtmlService)
  const htmlOutput = HtmlService.createHtmlOutput(`
    <script>
      const sliceWidth = ${sliceWidth};
      const sliceHeight = ${sliceHeight};
      const splitRows = ${splitRows};
      const splitCols = ${splitCols};
      
      async function processImage() {
        const img = new Image();
        img.src = '${imageUrl}';
        await new Promise(resolve => img.onload = resolve);
        
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        const slices = [];

        for (let row = 0; row < splitRows; row++) {
          for (let col = 0; col < splitCols; col++) {
            canvas.width = sliceWidth;
            canvas.height = sliceHeight;
            // 切割原图对应区域到Canvas
            ctx.drawImage(img, 
              col * sliceWidth, row * sliceHeight, sliceWidth, sliceHeight,
              0, 0, sliceWidth, sliceHeight
            );
            // 将Canvas内容转为Base64格式
            const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
            const base64 = await new Promise(resolve => {
              const reader = new FileReader();
              reader.onload = e => resolve(e.target.result.split(',')[1]);
              reader.readAsDataURL(blob);
            });
            slices.push({rowOffset: row, colOffset: col, base64});
          }
        }
        // 将切片数据传回App Script
        google.script.run.returnSlices(slices, sliceWidth, sliceHeight, ${startRow}, ${startCol});
      }
      processImage();
    </script>
  `);
  SpreadsheetApp.getUi().showModalDialog(htmlOutput.setHeight(100).setWidth(300), "图片分割中...");
}

function returnSlices(slices, sliceWidth, sliceHeight, startRow, startCol) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  slices.forEach(slice => {
    const targetRow = startRow + slice.rowOffset;
    const targetCol = startCol + slice.colOffset;
    const cell = sheet.getRange(targetRow, targetCol);
    
    // 调整单元格大小匹配切片尺寸
    cell.setRowHeight(sliceHeight);
    cell.setColumnWidth(sliceWidth);
    
    // 将Base64数据转为Blob并插入单元格
    const imageBlob = Utilities.newBlob(Utilities.base64Decode(slice.base64), 'image/png');
    sheet.insertImage(imageBlob, targetCol, targetRow);
  });
  
  SpreadsheetApp.getUi().alert("图片已成功分割并插入单元格!");
}

注意事项

  • 若Sheet中有多张图片,可修改getImages()[0]的索引值指定目标图片
  • 本地上传的图片通过getUrl()获取的是临时链接,可能失效,建议将图片上传至Google Drive并设置“任何人可查看”权限,替换为Drive的永久直接链接
  • 处理大尺寸图片时可能出现延迟,建议提前压缩图片尺寸
  • 首次运行脚本需授权访问Sheet、UrlFetch等相关权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:18:21