google-apps-script - Apps 脚本:需要将具有超链接的唯一记录从一个选项卡附加到另一个选项卡
问题描述
我有一个脚本来附加唯一记录。但是,当我运行脚本时,它会将带有超链接的文件名转换为简单的文本(删除超链接)。如何在将记录从一个选项卡附加到另一个选项卡时保留超链接文件名?
附加唯一记录应用程序脚本:
function appendUniqueRows() {
var ss = SpreadsheetApp.getActive();
var sourceSheet = ss.getSheetByName('Tab 1');
var destSheet = ss.getSheetByName('Tab 2');
var sourceData = sourceSheet.getRange('W5:AC5').getValues();
var destData = destSheet.getDataRange().getValues();
// Check whether destination sheet is empty
if (destData.length === 1 && "" === destData[0].join('')) {
// Empty, so ignore the phantom row
destData = [];
}
// Generate hash for comparisons
var destHash = {};
destData.forEach(function(row) {
destHash[row.join('')] = true; // could be anything
});
// Concatentate source rows to dest rows if they satisfy a uniqueness filter
var mergedData = destData.concat(sourceData.filter(function (row) {
var hashedRow = row.join('');
if (!destHash.hasOwnProperty(hashedRow)) {
// This row is unique
destHash[hashedRow] = true; // Add to hash for future comparisons
return true; // filter -> true
}
return false; // not unique, filter -> false
}));
// Check whether two data sets were the same width
var sourceWidth = (sourceData.length > 0) ? sourceData[0].length : 0;
var destWidth = (destData.length > 0) ? destData[0].length : 0;
if (sourceWidth !== destWidth) {
// Pad out all columns for the new row
var mergedWidth = Math.max(sourceWidth,destWidth);
for (var row=0; row<mergedData.length; row++) {
for (var col=mergedData[row].length; col<mergedWidth; col++)
mergedData[row].push('');
}
}
// Write merged data to destination sheet
destSheet.getRange(1, 1, mergedData.length, mergedData[0].length)
.setValues(mergedData);
}
解决方案
您可以使用富文本值
例如:
function copyTextWithLink() {
file = SpreadsheetApp.getActive();
sheet1 = file.getSheetByName("Sheet1");
sheet2 = file.getSheetByName("Sheet2");
range1 = sheet1.getDataRange();
values1 = range1.getRichTextValues();
let output = values1.map((row) => {
return row.map((cell) => {
let newCell = SpreadsheetApp.newRichTextValue()
.setText(cell.getText())
.setLinkUrl(cell.getLinkUrl())
.build();
return newCell;
});
});
let height = output.length
let width = output[0].length
let outputRange = sheet2.getRange(1,1,height,width)
outputRange.setRichTextValues(output)
}
解释
- 此脚本只是说明如何在 Apps 脚本中使用富文本功能。
- 它将值从一张纸复制到另一张纸上,保持超链接。源表中的所有值都带有超链接。
- 第一步是获取超链接值所在的范围,然后调用
getRichTextValues
它们。getValues
除了返回一个RichTextValue
对象外,它的功能相同。 - 接下来是将富文本值的二维数组转换为另一个具有富文本值的数组。这在这里是多余的,因为您可以跳过它并直接用于
setRichTextValues
复制所有数据,包括到目标的超链接。包含此步骤是为了说明如何从富文本值数组中单独获取和设置文本或链接。 - 构建富文本值涉及使用
RichTextValueBuilder
:
let newCell = SpreadsheetApp.newRichTextValue()
.setText(cell.getText())
.setLinkUrl(cell.getLinkUrl())
.build();
参考
推荐阅读
- r - 在森林函数中重复变量名
- python - Python - 将每个字符移动到字符串末尾而不重用原始字符串
- html - 在我的 C++ 程序中单击“帮助”按钮是否可以打开一个 html 页面?
- python - 开源板载文件同步 USB 程序。需要使用 config.ini 允许用户输入路径,但是有问题
- tensorflow - Tensorflow softmax 不忽略掩码值
- r - 在 Shiny 中动态排列图像
- sd-card - 从 SD 卡刷新 Google Coral 板失败并出现错误:“源”命令的图像格式错误
- python - 如果一列大于另一列,则删除行
- reactjs - 从同一个外部链接连接 2 个不同的数组 - React hooks fetch
- c - About matrix operations