ГАЗ: Практический пример использования DeveloperMetadata?(Изм) - PullRequest
0 голосов
/ 30 декабря 2018

Недавно я обнаружил опубликованные новые классы и методы электронной таблицы, связанные с DeveloperMetadata : Может ли кто-нибудь предоставить код, демонстрирующий практическое использование таких структур данных?

Я пытался понять идею метаданных, но пока это слишком запутанно для меня.

Давайте предположим, что этот сценарий - я разрабатываю некоторую автоматизацию для электронных таблиц.Есть таблица с заказами (дата, имя клиента, название проданного товара, цена и т. Д.).В ограниченном сценарии я обращаюсь к столбцу цен следующим образом sheet.getRange("H:H") (жестко).Но когда пользователь листа изменит положение столбца «H» где-то еще, скрипт перестанет работать должным образом - если я не изменю код «H» на букву нового столбца.

Может кто-нибудь предоставить реальный код GAS (не Advanced Sheet Services), который покажет, как легко справиться с этой ситуацией.

Я представляю что-то вроде этого:

PSEUDO CODE

sheet.getRange("H:H").setMatadata("columnName","price"); //First set column identification

var priceColumnRange = sheet.getMetadaDataByKey("price").getRange(); //Then retrieve column range by its identification

Я нашел способ, какустановить метаданные в диапазон, но я не нашел способа, как легко получить (поиск / найти) эти данные.Это выглядит действительно сложно из документации, и я до сих пор не знаю, как использовать метаданные для такой простой задачи.Если у вас есть практический опыт работы с метаданными, пожалуйста, поделитесь своими идеями кода.Спасибо за любые примеры кода.

1 Ответ

0 голосов
/ 31 декабря 2018
  • Вы хотите искать и получать DeveloperMetadata из строк и столбцов, используя Class DeveloperMetadata.
    • Вам нужны примеры сценариев для вышеуказанной ситуации.

Если мое понимание верно, как насчет этого примера сценария?Я пытался думать об этой ситуации, потому что это также полезно для моей ситуации.Я думаю, что есть несколько примеров сценариев для вашей ситуации.Поэтому, пожалуйста, подумайте об этом как об одном из них.

Пример сценария 1:

В этом примере сценария все DeveloperMetadata извлекаются из листа с именем листа «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».
  • Например, если вы хотите выполнять поиск по ключу и значению, вы также можете использовать следующие сценарии.
    • 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();
  • Это пример сценария.Поэтому, пожалуйста, измените это для вашей ситуации.

Результат:

Когда 2 DeveloperMetadata {key1: "value1"} и {key2: "value2"} установлены в строку 1 и столбец A, получается следующий результат.

[
  {
    "range": "1:1",
    "type": "ROW",
    "key1": "value1"
  },
  {
    "range": "A:A",
    "type": "COLUMN",
    "key2": "value2"
  }
]

Пример сценария 2:

В качестве другого способа вы также можете искать DeveloperMetadata с помощью API Sheets следующим образом.Когда вы используете Sheets API, пожалуйста, включите Sheets API в Advanced Google Services и консоли API.О том, как включить API Sheets, можно узнать по здесь .

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. Envn, если столбец "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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...