使用 Google 应用程序脚本将数据附加到 sheet,使用元数据确保数据位于正确的列中
Using Google App Scripts to append data to a sheet using MetaData to make sure it goes in the right column
我想将一个对象传递给我编写的 Google Sheet Web 应用程序,并将该数据附加到 Google Sheet。我想确保数据最终出现在正确的列中。
我可以将数据附加到文件中,但是如果列是 added/maniputated 等,这可能会导致问题
我已经为对应于对象键的每一列创建了列元数据。
我可以通读列元数据并找到每个列代表的列号。 IE。如果我得到 "orderNumber" 的元数据,我可以看到它在第 1 行。
网络应用代码。
function doGet(e) {
var p = e.parameter;
var sheetName = "Orders";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var appendList = JSON.parse(p.appendList)[0];
var returnValue = {};
returnValue["status"] ="error";
//var appendRow = sheet.getLastRow()+1;
var values = []
for (var key in appendList) {
values.push(appendList[key]);
Logger.log(searchAndReturnCol(key+"Column")); // just to show I can get the column number from meta data
}
sheet.appendRow(values);
return ContentService.createTextOutput(JSON.stringify(returnValue));
}
function testDoGet() { // emmulates what will past over by the app
var e = [];
var test = [{
'orderNumber' : "vsdv",
'name' : "Bob",
'porkDumpling' : 0,
'prawnDumpling' : 0,
'vegetarianDumpling' : 0,
'sauce' : "Spicey",
'paymentMethod' : "Cash",
'dollarReceivable' : 5,
'dollarReceived' :5,
'collectionDate' : 44234244,
'packed' : "No",
'collected' : "No",
'comments' : "This is a comment"
}]
var mod = JSON.stringify (test)
e.parameter = {
'appendList':mod,
}
doGet(e)
//displayLog (doGet(e));
}
查找元数据的代码
function searchAndReturnCol (key){
var colLevel = cSAM.SAM.searchByKey (SSID , key);
return colLevel.matchedDeveloperMetadata[0].developerMetadata.location.dimensionRange.endIndex
}
我不确定的是如何将这两个想法结合在一起。我想检查对象中的键,然后确保根据列元数据将此数据插入到正确的列中。
- 在您的 Spreadsheet(
Orders
的 sheet)中,每一列都有开发者元数据。
- 开发者元数据的每个键与您要放入 Spread 的对象的键相同sheet。
- 当开发者元数据和您提供的数据的键相同时,您想将值放入列。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。
修改点:
- 当
doGet
为 运行 时,开发者元数据按列的顺序检索。那时,使用检索到的开发者元数据的密钥,从提供的数据创建用于 Spreadsheet 的数据。
修改后的脚本:
当您的脚本修改时,请修改如下。
发件人:
var values = []
for (var key in appendList) {
values.push(appendList[key]);
Logger.log(searchAndReturnCol(key+"Column")); // just to show I can get the column number from meta data
}
收件人:
var columnToLetter = function(column) { // From
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var col = sheet.getLastColumn();
var values = [];
for (var i = 0; i < col; i++) {
var d = sheet.getRange(columnToLetter(i + 1) + ":" + columnToLetter(i + 1)).getDeveloperMetadata();
for (var j = 0; j < d.length; j++) {
values.push(appendList[d[j].getKey()]);
}
}
注:
如果上述修改后的脚本没有从您的 Spreadsheet 中检索开发者元数据,请使用以下脚本将开发者元数据添加到每一列。如果要重新排列列的键,请修改 keys
.
function createDeveloperMetadata() {
var columnToLetter = function(column) { // From
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var keys = {orderNumber:"",name:"",porkDumpling:"",prawnDumpling:"",vegetarianDumpling:"",sauce:"",paymentMethod:"",dollarReceivable:"",dollarReceived:"",collectionDate:"",packed:"",collected:"",comments:""};
var sheet = SpreadsheetApp.getActiveSheet();
Object.keys(keys).forEach(function(e, i) {
sheet.getRange(columnToLetter(i + 1) + ":" + columnToLetter(i + 1)).addDeveloperMetadata(e, keys[e]);
});
}
添加开发者元数据时,请检查当前元数据。因为可以将相同的键添加到元数据中。
- 如果您想更新所有元数据,我建议删除它们并添加新的元数据。
当您修改了Web Apps的脚本时,请将Web Apps重新部署为新版本。由此,最新的脚本被反映到Web Apps。请注意这一点。在您的脚本中,当您使用 testDoGet
测试脚本时,不需要重新部署它。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
我想将一个对象传递给我编写的 Google Sheet Web 应用程序,并将该数据附加到 Google Sheet。我想确保数据最终出现在正确的列中。
我可以将数据附加到文件中,但是如果列是 added/maniputated 等,这可能会导致问题
我已经为对应于对象键的每一列创建了列元数据。
我可以通读列元数据并找到每个列代表的列号。 IE。如果我得到 "orderNumber" 的元数据,我可以看到它在第 1 行。
网络应用代码。
function doGet(e) {
var p = e.parameter;
var sheetName = "Orders";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var appendList = JSON.parse(p.appendList)[0];
var returnValue = {};
returnValue["status"] ="error";
//var appendRow = sheet.getLastRow()+1;
var values = []
for (var key in appendList) {
values.push(appendList[key]);
Logger.log(searchAndReturnCol(key+"Column")); // just to show I can get the column number from meta data
}
sheet.appendRow(values);
return ContentService.createTextOutput(JSON.stringify(returnValue));
}
function testDoGet() { // emmulates what will past over by the app
var e = [];
var test = [{
'orderNumber' : "vsdv",
'name' : "Bob",
'porkDumpling' : 0,
'prawnDumpling' : 0,
'vegetarianDumpling' : 0,
'sauce' : "Spicey",
'paymentMethod' : "Cash",
'dollarReceivable' : 5,
'dollarReceived' :5,
'collectionDate' : 44234244,
'packed' : "No",
'collected' : "No",
'comments' : "This is a comment"
}]
var mod = JSON.stringify (test)
e.parameter = {
'appendList':mod,
}
doGet(e)
//displayLog (doGet(e));
}
查找元数据的代码
function searchAndReturnCol (key){
var colLevel = cSAM.SAM.searchByKey (SSID , key);
return colLevel.matchedDeveloperMetadata[0].developerMetadata.location.dimensionRange.endIndex
}
我不确定的是如何将这两个想法结合在一起。我想检查对象中的键,然后确保根据列元数据将此数据插入到正确的列中。
- 在您的 Spreadsheet(
Orders
的 sheet)中,每一列都有开发者元数据。- 开发者元数据的每个键与您要放入 Spread 的对象的键相同sheet。
- 当开发者元数据和您提供的数据的键相同时,您想将值放入列。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。
修改点:
- 当
doGet
为 运行 时,开发者元数据按列的顺序检索。那时,使用检索到的开发者元数据的密钥,从提供的数据创建用于 Spreadsheet 的数据。
修改后的脚本:
当您的脚本修改时,请修改如下。
发件人:
var values = []
for (var key in appendList) {
values.push(appendList[key]);
Logger.log(searchAndReturnCol(key+"Column")); // just to show I can get the column number from meta data
}
收件人:
var columnToLetter = function(column) { // From
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var col = sheet.getLastColumn();
var values = [];
for (var i = 0; i < col; i++) {
var d = sheet.getRange(columnToLetter(i + 1) + ":" + columnToLetter(i + 1)).getDeveloperMetadata();
for (var j = 0; j < d.length; j++) {
values.push(appendList[d[j].getKey()]);
}
}
注:
如果上述修改后的脚本没有从您的 Spreadsheet 中检索开发者元数据,请使用以下脚本将开发者元数据添加到每一列。如果要重新排列列的键,请修改
keys
.function createDeveloperMetadata() { var columnToLetter = function(column) { // From var temp, letter = ''; while (column > 0) { temp = (column - 1) % 26; letter = String.fromCharCode(temp + 65) + letter; column = (column - temp - 1) / 26; } return letter; }; var keys = {orderNumber:"",name:"",porkDumpling:"",prawnDumpling:"",vegetarianDumpling:"",sauce:"",paymentMethod:"",dollarReceivable:"",dollarReceived:"",collectionDate:"",packed:"",collected:"",comments:""}; var sheet = SpreadsheetApp.getActiveSheet(); Object.keys(keys).forEach(function(e, i) { sheet.getRange(columnToLetter(i + 1) + ":" + columnToLetter(i + 1)).addDeveloperMetadata(e, keys[e]); }); }
添加开发者元数据时,请检查当前元数据。因为可以将相同的键添加到元数据中。
- 如果您想更新所有元数据,我建议删除它们并添加新的元数据。
当您修改了Web Apps的脚本时,请将Web Apps重新部署为新版本。由此,最新的脚本被反映到Web Apps。请注意这一点。在您的脚本中,当您使用
testDoGet
测试脚本时,不需要重新部署它。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。