GAS:DeveloperMetadata的实际用例? (编辑)

时间:2018-12-29 23:09:47

标签: google-apps-script google-sheets

我最近发现与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

我找到了一种将元数据设置为范围的方法,但是我没有找到如何轻松地检索(搜索/查找)此数据的方法。 从文档看来,这确实很困难,而且我仍然不知道如何使用元数据来完成如此简单的任务。如果您对元数据有任何实际经验,请分享您的代码思想。感谢您提供的任何代码示例。

2 个答案:

答案 0 :(得分:1)

  • 您要使用Class DeveloperMetadata从行和列中搜索和检索DeveloperMetadata。
    • 您需要上述情况的示例脚本。

如果我的理解是正确的,那么该示例脚本如何?我试图考虑这种情况,因为这对我的情况也很有用。我认为针对您的情况有几个示例脚本。因此,请将此视为其中之一。

示例脚本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)
  • 作为示例情况,将DeveloperMetadata设置为“ A”列后,将其移至“ B”列时,此脚本将检索“ B”列的键和值。
  • 例如,如果要使用键和值进行搜索,则还可以使用以下脚本。
    • 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。您可以在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);

参考:

如果这不是您想要的,对不起。

编辑:

关于第二个问题。

  1. 在“ H:H”中添加元数据作为“ columnName”的键和“ price”的值。
  2. 如果列“ 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.

答案 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"