Получить конкретные ссылки на метаданные разработчика - PullRequest
1 голос
/ 06 апреля 2019

Добавление метаданных на лист в Google Sheets действительно просто. Возьмем для примера:

  var newSheet = ss.insertSheet(obj.jobName); 
  newSheet.addDeveloperMetadata(metaKey, metaValue);

Теперь я хочу получить указанные данные. Насколько я вижу, не существует простого способа просто получить значение по ключу? Я вижу DeveloperMetadataFinder класс , который я все еще пытаюсь обернуть вокруг. Я полагаю, это то, что мне нужно использовать? Но наверняка должен быть более простой способ?

Я знаю, что могу получить все метаданные, используя следующий код:

  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (i = 1; i < sheets.length; i++) { 
    sheets[i].getDeveloperMetadata();
  }

Однако этот код возвращает все метаданные, и тогда вы не сможете получить доступ к данным с помощью metaKey, который использовался.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Существует ли простой и простой способ убедиться на 100%, что метаданные, которые вы сохранили, - это метаданные, которые вы получили?Нет. Есть способ, но это не просто и не просто.

Ключи метаданных не заменяются.Можно иметь несколько объектов метаданных с одинаковым именем ключа.Однако они будут иметь разные идентификационные номера.Вы можете доказать это самому себе с помощью приведенного ниже кода.

Приведенный ниже код добавляет метаданные 3 раза с одним и тем же именем и значением ключа.Затем он получает все метаданные, проходит по объекту, регистрирует имя, идентификатор и значение.Наконец, он удаляет объект метаданных.

function testMetaData() {
  var ss = SpreadsheetApp.getActive();

  for (var i = 0;i<3;i++) {//Loop 3 times
    ss.addDeveloperMetadata('keyOne','valueOne');//Add metadata with the same key name and value
  }

  var mtaData = ss.getDeveloperMetadata();
  Logger.log(mtaData.length)//The number of meta data objects in the spreadsheet

  mtaData.forEach(//Loop through every element of the meta data
    function(thisMetaData) {
      Logger.log(thisMetaData.getValue())
      Logger.log(thisMetaData.getId())
      Logger.log(thisMetaData.getKey())
      thisMetaData.remove();//Remove this metadata
    }
  )
}

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

Если метаданные уже добавлены и их несколькообъекты метаданных с тем же именем ключа, и вы не знаете требуемый идентификатор, тогда вы можете удалить эти объекты метаданных с тем же именем ключа и начать заново.

Как только у вас есть идентификаторметаданных, то вы можете найти эти конкретные метаданные по идентификатору, и не будет никаких дубликатов.Очевидно, вам нужно знать идентификатор, но код должен знать имя ключа, если вы используете имя ключа.Таким образом, в любом случае вам нужно как-то иметь ключ или идентификатор.

function getMetaDataByID() {
  var finder,
      id,
      mtaData,
      numberOfMetaDataObjectsWithTheSameKeyName = 0,
      ss;

  ss = SpreadsheetApp.getActive();
  addDeveloperMetadata('myKeyName','valueOne');//

  mtaData = ss.getDeveloperMetadata();
  Logger.log(mtaData.length)//The number of meta data objects in the spreadsheet

  mtaData.forEach(//Loop through every element of the meta data
    function(thisMetaData) {
      var thisKey;

      thisKey = thisMetaData.getKey();

      Logger.log(thisMetaData.getValue())
      Logger.log(thisMetaData.getId())
      Logger.log(thisKey)

      if (thisKey === 'myKeyName') {
        numberOfMetaDataObjectsWithTheSameKeyName++;
        PropertiesService.getDocumentProperties().setProperty('id_Of_My_MetaData', thisMetaData.getId());
      }
    }
  )

  Logger.log('numberOfMetaDataObjectsWithTheSameKeyName: ' + numberOfMetaDataObjectsWithTheSameKeyName)

  //Now get the metadata by ID
  id = PropertiesService.getDocumentProperties().getProperty('id_Of_My_MetaData');
  Logger.log('id: ' +   id);
  finder = ss.createDeveloperMetadataFinder()
           .withId(id)
           .find()[0];

  var metaDataValue = finder.getValue();

  Logger.log('metaDataValue: ' + metaDataValue)
}
1 голос
/ 06 апреля 2019

Вы можете использовать DeveloperMetadataFinder так:

const devMetaData = SpreadsheetApp.getActive()
    .createDeveloperMetadataFinder()//@see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#createDeveloperMetadataFinder()
    .withKey(/*METADATA_KEY*/)
    .find()[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...