GAS 中 DeveloperMetadata 的实际用例
Practical use case of DeveloperMetadata in GAS
我最近发现了与 DeveloperMetadata 相关的已发布的新 类 和 Spreadsheet 的方法,我正在寻找显示此类数据结构实际使用的代码示例。
我试图掌握元数据的概念,但到目前为止它对我来说太混乱了。
让我们假设这种情况 - 我正在为传播sheets 开发一些自动化。有 table 个订单(日期、客户名称、已售商品名称、价格等)。在有界脚本中,我像这样处理价格列 sheet.getRange("H:H")
(硬编码)。但是,当 sheet 的用户在其他地方更改列 "H" 的位置时,脚本将停止正常工作 - 除非我将代码 "H" 更改为新的列字母。
我正在寻找一些真正的 GAS 代码(不是高级 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
我找到了一种将元数据设置到某个范围的方法,但我没有找到一种方法可以轻松检索 (search/find) 此数据。从文档上看真的很难,而且我仍然不知道如何使用元数据来完成这么简单的任务。
- 您想使用 Class DeveloperMetadata 从行和列中搜索和检索 DeveloperMetadata。
- 您需要上述情况的示例脚本。
如果我的理解是正确的,这个示例脚本怎么样?我试图考虑这种情况,因为这对我的情况也很有用。我认为有几个示例脚本适合您的情况。所以请将此视为其中之一。
示例脚本 1:
在此示例脚本中,所有 DeveloperMetadata 均从 sheet 中检索,该 sheet 名称为 "Sheet1"。
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)
- 作为示例情况,在 DeveloperMetadata 设置到列 "A" 后,当它移动到列 "B" 时,此脚本检索列 "B" 的键和值.
- 例如,如果你想使用key和value进行搜索,你也可以使用下面的脚本。
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"
}
]
示例脚本 2:
作为另一种方式,您也可以使用 Sheets API 搜索 DeveloperMetadata,如下所示。当您使用表格 API 时,请在高级 Google 服务和 API 控制台启用表格 API。您可以在 .
查看如何启用表格 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:H" 作为 "columnName" 的键和 "price" 的值。
- Envn 如果移动了列 "H",您希望使用元数据的值检索新范围。
如果我的理解是正确的,这个怎么样?
添加元数据
为了向列 "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.
这是一个超级简化的例子:
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]
引用:元数据对象有点像包含许多元素的数组。但是您仍然需要使用 DeveloperMetadataFinder 来根据键或值进行搜索:
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const finder = spreadSheet.createDeveloperMetadataFinder();
metaData = finder.withKey('initializeDone').find();
Logger.log(metaData[0].getValue()); // "true"
我最近发现了与 DeveloperMetadata 相关的已发布的新 类 和 Spreadsheet 的方法,我正在寻找显示此类数据结构实际使用的代码示例。
我试图掌握元数据的概念,但到目前为止它对我来说太混乱了。
让我们假设这种情况 - 我正在为传播sheets 开发一些自动化。有 table 个订单(日期、客户名称、已售商品名称、价格等)。在有界脚本中,我像这样处理价格列 sheet.getRange("H:H")
(硬编码)。但是,当 sheet 的用户在其他地方更改列 "H" 的位置时,脚本将停止正常工作 - 除非我将代码 "H" 更改为新的列字母。
我正在寻找一些真正的 GAS 代码(不是高级 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
我找到了一种将元数据设置到某个范围的方法,但我没有找到一种方法可以轻松检索 (search/find) 此数据。从文档上看真的很难,而且我仍然不知道如何使用元数据来完成这么简单的任务。
- 您想使用 Class DeveloperMetadata 从行和列中搜索和检索 DeveloperMetadata。
- 您需要上述情况的示例脚本。
如果我的理解是正确的,这个示例脚本怎么样?我试图考虑这种情况,因为这对我的情况也很有用。我认为有几个示例脚本适合您的情况。所以请将此视为其中之一。
示例脚本 1:
在此示例脚本中,所有 DeveloperMetadata 均从 sheet 中检索,该 sheet 名称为 "Sheet1"。
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)
- 作为示例情况,在 DeveloperMetadata 设置到列 "A" 后,当它移动到列 "B" 时,此脚本检索列 "B" 的键和值.
- 例如,如果你想使用key和value进行搜索,你也可以使用下面的脚本。
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"
}
]
示例脚本 2:
作为另一种方式,您也可以使用 Sheets API 搜索 DeveloperMetadata,如下所示。当您使用表格 API 时,请在高级 Google 服务和 API 控制台启用表格 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:H" 作为 "columnName" 的键和 "price" 的值。
- Envn 如果移动了列 "H",您希望使用元数据的值检索新范围。
如果我的理解是正确的,这个怎么样?
添加元数据
为了向列 "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.
这是一个超级简化的例子:
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]
引用:元数据对象有点像包含许多元素的数组。但是您仍然需要使用 DeveloperMetadataFinder 来根据键或值进行搜索:
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const finder = spreadSheet.createDeveloperMetadataFinder();
metaData = finder.withKey('initializeDone').find();
Logger.log(metaData[0].getValue()); // "true"