我在谷歌工作表中有两个函数,它们旨在循环通过包含谷歌驱动器中文件的文件ID的单列,发出Properties.get来检索单个属性"LastReview";对于每个文档,并将所有LastReview时间粘贴到下一个可用列中。
我很难在";loopForMetadata";工作。我希望它获取与每个文件ID相关联的所有LastReview时间的列表,然后将其发布到下一个可用列中,以便所有的LastReview时间与文件ID对齐。
function getProperty(fileId) {
var propertyKey = 'LastReview'
var fileId = '1UaQkJU8r1kE9sxpFg6OD8aOuUCoRnSpB9Agg_R9HJ3s'
var response = JSON.stringify(Drive.Properties.get(fileId, 'LastReview', { visibility: 'PUBLIC' }).value);
var key = "value";
var resposeNoQuote = response.replace(/"/g, "")
Logger.log(resposeNoQuote);
}
function loopForMetadata() {
var columnNeeded, data, lastColumn, sh;
sh = SpreadsheetApp.getActiveSheet();
lastColumn = sh.getLastColumn();
data = sh.getRange(1, 1, 1, lastColumn).getValues();//Get 2D array of all values in row one
data = data[0];//Get the first and only inner array
columnNeeded = data.indexOf('ID') + 1;//Arrays are zero indexed- add 1
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(2, columnNeeded, lastRow - 1, 1);
// Get array of values in the search Range
var rangeValues = searchRange.getValues();
// Loop through array and if condition met, add relevant
// background color.
var resultValues = []
for (i = 0; i < rangeValues.length; i++) {
resultValues.push(getProperty(rangeValues[i]));
Utilities.sleep(10);
}
Logger.log(resultValues);
};
我相信你的目标如下。
- 您希望使用属性中
LastReview
的键从fileId
的文件中检索值 - 您希望将检索到的值放在下一个可用列中
fileId
的同一行中 - 你想使用谷歌应用程序脚本来实现这一点
修改点:
- 在您的脚本中,
getProperty()
不返回值resultValues
未放入电子表格- 当您想要检索关键字
LastReview
的值时,Drive.Properties.get(fileId, 'LastReview', { visibility: 'PUBLIC' }).value
会直接返回该值
- 重要的一点是,当
fileId
的文件不具有密钥LastReview
的属性时,似乎Drive.Properties.get()
发生了错误。因此,在这次修改中,作为一个简单的变通方法,我使用了try-catch
当以上几点反映到您的脚本中时,它变成如下。
示例脚本:
function loopForMetadata() {
var columnNeeded, data, lastColumn, sh;
sh = SpreadsheetApp.getActiveSheet();
lastColumn = sh.getLastColumn();
data = sh.getRange(1, 1, 1, lastColumn).getValues();//Get 2D array of all values in row one
data = data[0];//Get the first and only inner array
columnNeeded = data.indexOf('ID') + 1;//Arrays are zero indexed- add 1
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(2, columnNeeded, lastRow - 1, 1);
var rangeValues = searchRange.getValues();
var resultValues = []
// I modified below script.
for (i = 0; i < rangeValues.length; i++) {
var fileId = rangeValues[i];
var value = "";
try {
value = Drive.Properties.get(fileId, 'LastReview', { visibility: 'PUBLIC' }).value;
} catch(e) {}
resultValues.push([value]);
// Utilities.sleep(10); // I'm not sure whether this is required.
}
sheet.getRange(2, lastColumn + 1, resultValues.length, 1).setValues(resultValues);
Logger.log(resultValues);
};
注:
- 请再次确认高级Google服务是否启用了Drive API
参考:
- 属性:get