获取特定的开发人员元数据参考

时间:2019-04-06 15:02:44

标签: google-apps-script google-sheets

将元数据添加到Google表格中的表格非常简单。例如:

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

我现在想检索所述数据。据我所知,没有简单的方法可以通过键检索值吗?我可以看到DeveloperMetadataFinder class,但我仍在努力寻找解决方案。我认为那是我需要使用的东西?但是肯定有一种更简单的方法吗?

我知道我可以使用以下代码获取所有元数据:

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

但是,该代码返回了所有元数据,因此您似乎无法通过已使用的metaKey访问数据。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用DeveloperMetadataFinder

const devMetaData = SpreadsheetApp.getActive()
    .createDeveloperMetadataFinder()//@see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#createDeveloperMetadataFinder()
    .withKey(/*METADATA_KEY*/)
    .find()[0];

答案 1 :(得分:1)

是否有一种简单的方法可以100%确保您保存的元数据是您检索的元数据?否。有一种方法,但这并不容易。

元数据键不会被替换。可能有多个具有完全相同的键名的元数据对象。但是,它们将具有不同的ID号。您可以使用以下代码向自己证明这一点。

下面的代码使用相同的键名和值将元数据添加3次。然后,它获取所有元数据,遍历对象,记录名称,ID和值。最后,它将删除元数据对象。

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
    }
  )
}

由于可以有多个具有相同键名的元数据对象,因此需要非常小心地设置和获取元数据。如果未设置元数据,则可以添加元数据,然后获取元数据,然后获取第一个也是唯一的元素,然后获取该元素的ID。然后将ID存储在Properties Service中。您可以确保已检索到的元数据是您期望的元数据的唯一方法是检查ID号。

如果已经添加了元数据,并且有多个具有相同键名的元数据对象,并且您不知道所需的ID,那么您可能希望删除具有相同键的那些元数据对象名称,然后重新开始。

一旦有了元数据的ID,就可以通过ID找到该特定的元数据,并且不会有任何重复。显然,您需要知道ID,但是如果您使用的是键名,则代码需要知道键名。因此,无论哪种方式,您都需要以某种方式获得密钥或ID。

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)
}