将元数据添加到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
访问数据。
答案 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)
}