首页 > 解决方案 > 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);
}

标签: google-apps-scriptgoogle-sheets

解决方案


您可以使用富文本值

例如:

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();

参考


推荐阅读