我最近发现与DeveloperMetadata相关的已发布的新电子表格类和方法: 有人可以提供显示此类数据结构实际使用的代码吗?
我试图掌握元数据的概念,但到目前为止,它对我来说还是令人困惑。
让我们假设这种情况-我正在为电子表格开发一些自动化。
有带有订单的表(日期,客户名称,已售商品名称,价格等)。
在有界脚本中,我像这样sheet.getRange("H:H")
(硬编码)处理价格列。但是,当工作表的用户在其他地方更改“ H”列的位置时,脚本将停止正常工作-除非我将代码“ H”更改为新的列字母。
有人可以提供真实的GAS代码(不是Advanced Sheet服务)来显示如何轻松处理这种情况。
我在想像这样的东西:
伪代码
sheet.getRange("H:H").setMatadata("columnName","price"); //First set column identification
var priceColumnRange = sheet.getMetadaDataByKey("price").getRange(); //Then retrieve column range by its identification
我找到了一种将元数据设置为范围的方法,但是我没有找到如何轻松地检索(搜索/查找)此数据的方法。 从文档看来,这确实很困难,而且我仍然不知道如何使用元数据来完成如此简单的任务。如果您对元数据有任何实际经验,请分享您的代码思想。感谢您提供的任何代码示例。
答案 0 :(得分:1)
如果我的理解是正确的,那么该示例脚本如何?我试图考虑这种情况,因为这对我的情况也很有用。我认为针对您的情况有几个示例脚本。因此,请将此视为其中之一。
在此示例脚本中,从表名为“ Sheet1”的表中检索所有DeveloperMetadata。
var s = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var v = s.getRange(1, 1, s.getMaxRows(), s.getMaxColumns()).createDeveloperMetadataFinder().onIntersectingLocations().find();
var res = v.map(function(e) {
var loc = e.getLocation();
var obj = loc.getLocationType() === SpreadsheetApp.DeveloperMetadataLocationType.COLUMN ? {range: loc.getColumn().getA1Notation()} :
loc.getLocationType() === SpreadsheetApp.DeveloperMetadataLocationType.ROW ? {range: loc.getRow().getA1Notation()} : {};
obj[e.getKey()] = e.getValue();
return obj;
});
Logger.log(res)
var v = s.getRange(1, 1, s.getMaxRows(), s.getMaxColumns()).createDeveloperMetadataFinder().onIntersectingLocations().withKey("key1").find();
var v = s.getRange(1, 1, s.getMaxRows(), s.getMaxColumns()).createDeveloperMetadataFinder().onIntersectingLocations().withValue("value").find();
var v = s.getRange(1, 1, s.getMaxRows(), s.getMaxColumns()).createDeveloperMetadataFinder().onIntersectingLocations().withKey("key1").withValue("value1").find();
将{key1: "value1"}
和{key2: "value2"}
的2个DeveloperMetadata设置为第1行和第A列时,将获得以下结果。
[
{
"range": "1:1",
"type": "ROW",
"key1": "value1"
},
{
"range": "A:A",
"type": "COLUMN",
"key2": "value2"
}
]
另一种方法是,您还可以使用Sheets API搜索DeveloperMetadata,如下所示。使用表格API时,请在高级Google服务和API控制台中启用表格API。您可以在here上了解如何启用Sheets API。
var resource = {"dataFilters": [{"developerMetadataLookup": {"metadataKey": "key1"}}]}; // Search by key
// var resource = {"dataFilters": [{"developerMetadataLookup": {"metadataValue": "value1"}}]}; // Search by value
// var resource = {"dataFilters": [{"developerMetadataLookup": {"metadataKey": "key1", "metadataValue": "value1"}}]}; // Search by key and value
var res = Sheets.Spreadsheets.DeveloperMetadata.search(resource, spreadsheetId);
如果这不是您想要的,对不起。
关于第二个问题。
如果我的理解正确,那怎么办?
为了将元数据添加到“ H”列,可以使用以下脚本。由于没有setMatadata()
的方法,请使用addDeveloperMetadata()
。
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange("H:H").addDeveloperMetadata("columnName", "price");
此示例脚本使用元数据值检索范围。在此脚本中,envn如果移动了“ H”列,则可以检索使用元数据值的新范围。
var sheet = SpreadsheetApp.getActiveSheet();
var value = "price";
var v = sheet.getRange(1, 1, 1, sheet.getMaxColumns())
.createDeveloperMetadataFinder()
.onIntersectingLocations()
.withValue(value)
.find();
var ranges = v.map(function(e) {return e.getLocation().getColumn()}); // "ranges" is one dimensional array.
答案 1 :(得分:1)
这是一个超级简化的示例:
const initialize = () => {
spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
spreadSheet.addDeveloperMetadata("initializeDone", "true", SpreadsheetApp.DeveloperMetadataVisibility.DOCUMENT)
const metaData = spreadSheet.getDeveloperMetadata();
Logger.log('Metadata key: ' + metaData[0].getKey()); // "initializedDone"
Logger.log('Metadata value: ' + metaData[0].getValue()); // "true"
}
注意[0]
引用:metaData对象有点像包含许多元素的数组。但是您仍然需要使用DeveloperMetadataFinder根据键或值进行搜索:
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const finder = spreadSheet.createDeveloperMetadataFinder();
metaData = finder.withKey('initializeDone').find();
Logger.log(metaData[0].getValue()); // "true"