提问人:LionelHutz 提问时间:9/27/2023 更新时间:9/27/2023 访问量:67
由于数据验证,无法记录单元格的富文本字符串?
Can't log richtext string of a cell because of data validation?
问:
我的单元格 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?
答:
1赞
Tanaike
9/27/2023
#1
修改要点:
- 从您显示的错误消息和 by 的值中,我猜想您的单元格值“F394”可能是日期对象。在这种情况下,会发生这样的错误。因为为 null。我猜这可能是您当前问题的原因。
Sun Oct 08 00:00:00 GMT+02:00 2023
getValues
cell.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/......也许你能帮忙?
评论