能否在Google Sheets插入图片并通过App Script将其均分至指定单元格?
可以实现!用Google Apps Script将图片分割到指定单元格
完全可行,通过Google Apps Script结合前端Canvas API,就能把插入到Google Sheets的图片均匀切割并分配到指定数量的单元格中。以下是具体实现思路和代码:
核心逻辑
- 提取目标图片的原始尺寸和二进制数据(Blob)
- 根据指定的分割行列数,计算每个小切片的尺寸
- 借助Canvas API切割原图,生成对应数量的小图片Blob
- 将每个小图片插入到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
相关产品推荐
相关产品推荐

