由于数据验证,无法记录单元格的富文本字符串?

Can't log richtext string of a cell because of data validation?

提问人:LionelHutz 提问时间:9/27/2023 更新时间:9/27/2023 访问量:67

问:

我的单元格 F394 如下所示:

08/10/2023 并且有一个链接附加到它(不是超链接,而是 RichText)。

数据验证处于活动状态,仅允许以这种格式(dd/mm/yyyy)进行短日期验证。

我想获取/记录通过脚本附加的 URL:

function logURLToCloudLogs() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getRange("F394"); 
  var richTextValue = cell.getRichTextValue();

  for (var i = 0; i < richTextValue.getTextRuns().length; i++) {
    var textRun = richTextValue.getTextRuns()[i];
    if (textRun.getLinkUrl()) {
      var linkUrl = textRun.getLinkUrl();
      Logger.log("URL:" + linkUrl);
      return;
    }
  }

  Logger.log("Cell contains no URL.");
}

但它会导致错误:

TypeError:无法读取 null 的属性(读取“getTextRuns”) logURLToCloudLogs @ ShowDateEdit.gs:7

当我通过 .getValue() 记录单元格的值时,我得到:

周日 10月 08 00:00:00 GMT+02:00 2023

我的怀疑是,由于数据验证,应用程序脚本不会将字符串识别为 richtext。

谁能帮我成功记录富文本并获取URL?

google-apps-script google-sheets rtf 富文本

评论


答:

1赞 Tanaike 9/27/2023 #1

修改要点:

  • 从您显示的错误消息和 by 的值中,我猜想您的单元格值“F394”可能是日期对象。在这种情况下,会发生这样的错误。因为为 null。我猜这可能是您当前问题的原因。Sun Oct 08 00:00:00 GMT+02:00 2023getValuescell.getRichTextValue()

在这种情况下,当您的显示脚本被修改时,如何进行以下修改?

修改后的脚本:

function logURLToCloudLogs() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getRange("F394"); 
  var orgNumberFormats = cell.getNumberFormats();
  cell.setNumberFormat("@");
  var richTextValue = cell.getRichTextValue();
  cell.setNumberFormats(orgNumberFormats);
  var runs = richTextValue.getRuns();
  for (var i = 0; i < runs.length; i++) {
    var textRun = runs[i];
    if (textRun.getLinkUrl()) {
      var linkUrl = textRun.getLinkUrl();
      Logger.log("URL:" + linkUrl);
      return;
    }
  }
  Logger.log("Cell contains no URL.");
}
  • 在此修改中,单元格格式更改为文本格式。并且,检索 richtectValue。并且,单元格格式更改为原始格式。

  • 我认为以下修改也可以使用。

    function logURLToCloudLogs() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var cell = sheet.getRange("F394"); 
      var orgNumberFormats = cell.getNumberFormats();
      cell.setNumberFormat("@");
      var richTextValue = cell.getRichTextValue();
      cell.setNumberFormats(orgNumberFormats);
      var linkUrl = richTextValue.getLinkUrl();
      if (linkUrl) {
        Logger.log("URL:" + linkUrl);
        return;
      }
      Logger.log("Cell contains no URL.");
    }
    
  • 顺便说一下,类 RichTextValue 没有 .在本例中,它可能是 getRuns()。请小心这一点。getTextRuns()

注意:

  • 即使可以使用 Sheets API,也可以检索超链接。但是,从您的脚本来看,当使用电子表格服务(SpreadsheetApp)时,我认为它可能很有用。所以,我提出了上面的修改。

引用:

评论

0赞 LionelHutz 9/27/2023
非常感谢。你的两个脚本都像一个魅力。有些英雄不穿斗篷!
0赞 Tanaike 9/28/2023
@LionelHutz 感谢您的回复。我很高兴您的问题已得到解决。也谢谢你。
0赞 LionelHutz 10/3/2023
这里有一个与此密切相关的后续问题:stackoverflow.com/questions/77223281/......也许你能帮忙?