使用 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 测试脚本时,不需要重新部署它。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。