所以我一直在使用这个在文档社区论坛上找到的现有脚本将数据和公式从源复制到目标。它工作得很好,但唯一的问题是 它在脚本遇到带有单元内图像的单元格时失败/停止。
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);
}
希望有人可以修改脚本以包含单元格图像以及与数据+公式一起复制和粘贴。
getValues
检索到的CellImage对象可能无法通过
setValues
直接放入单元格中。因此,在这个答案中,作为一种解决方法,我想建议使用我创建的 Google Apps 脚本库。当这反映在你的脚本中时,它会变成如下所示。用途:
库DocsServiceApp。您可以在此处查看如何安装它。
2.修改后的脚本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);
}