修改脚本以“导入单元格图像”以及数据+公式

问题描述 投票:0回答:1

所以我一直在使用这个在文档社区论坛上找到的现有脚本将数据和公式从源复制到目标。它工作得很好,但唯一的问题是 它在脚本遇到带有单元内图像的单元格时失败/停止

    图像也直接嵌入到源单元格中(
  • 插入>图像>在单元格中插入图像),而不是通过image function
    
    
function copyFormulasAndValues() { const rangeA1 = 'C4:D31'; const sourceRange = SpreadsheetApp .openById('1B_tK9FP8q1Cs1Cuqv7xWq5QSsBbRLY-k-nhxUhv4H7k') .getRange('Sheet1!' + rangeA1); const targetRange = SpreadsheetApp .getActive() .getRange('Sheet1!' + rangeA1); const values = sourceRange.getValues(); sourceRange.getFormulas().map(function (row, rowIndex) { row.map(function (formula, columnIndex) { if (formula) { values[rowIndex][columnIndex] = formula; } }); }); targetRange.setValues(values); }
希望有人可以修改脚本以包含单元格图像以及与数据+公式一起复制和粘贴。

google-apps-script
1个回答
0
投票
问题和解决方法:

我跟你确认了同样的情况。我担心在现阶段,

getValues

检索到的CellImage对象可能无法通过
setValues
直接放入单元格中。因此,在这个答案中,作为一种解决方法,我想建议使用我创建的 Google Apps 脚本库。当这反映在你的脚本中时,它会变成如下所示。

用途:

1.安装库

请安装

库DocsServiceApp。您可以在此处查看如何安装它。

2.修改后的脚本

在此修改中,使用库 DocsServiceApp 将单元格中的图像作为 Blob 进行检索。并且,使用检索到的 Blob 创建 CellImage 对象。然后,使用

setValues

将创建的CellImage对象放入单元格中。

function copyFormulasAndValues() { const rangeA1 = 'C4:D31'; const sourceRange = SpreadsheetApp .openById('1B_tK9FP8q1Cs1Cuqv7xWq5QSsBbRLY-k-nhxUhv4H7k') .getRange('Sheet1!' + rangeA1); const targetRange = SpreadsheetApp .getActive() .getRange('Sheet1!' + rangeA1); // --- I added the below script. const sheet = sourceRange.getSheet(); const obj = DocsServiceApp.openBySpreadsheetId(sheet.getParent().getId()).getSheetByName(sheet.getSheetName()).getImages(); // --- const values = sourceRange.getValues(); sourceRange.getFormulas().map(function (row, rowIndex) { row.map(function (formula, columnIndex) { if (formula) { values[rowIndex][columnIndex] = formula; // --- I added the below script. } else if (values[rowIndex][columnIndex].valueType == SpreadsheetApp.ValueType.IMAGE) { const rowOffset = sourceRange.getRow(); const colOffset = sourceRange.getColumn(); const o = obj.find(({ range: { row, col } }) => row == rowIndex + rowOffset && col == columnIndex + colOffset); if (o) { values[rowIndex][columnIndex] = SpreadsheetApp.newCellImage().setSourceUrl(`data:${o.image.blob.getContentType()};base64,${Utilities.base64Encode(o.image.blob.getBytes())}`).build(); } else { values[rowIndex][columnIndex] = null; } } // --- }); }); targetRange.setValues(values); }

    当我测试这个脚本时,我确认单元格中的值、公式和图像可以复制。
参考:

  • DocsServiceApp(作者:我)
© www.soinside.com 2019 - 2024. All rights reserved.