Использование Google App Scripts для добавления данных на лист с помощью MetaData, чтобы убедиться, что они помещаются в правильный столбец - PullRequest
1 голос
/ 18 октября 2019

Я хочу передать объект в веб-приложение Google Sheet, которое я написал, и добавить эти данные в Google Sheet. Я хочу убедиться, что данные попадают в правильные столбцы.

Я могу добавить данные в файл, но это может вызвать проблемы, если столбцы добавляются / изменяются и т. Д.

У меня естьсозданы метаданные столбца для каждого столбца, который соответствует ключу объекта.

Я могу прочитать метаданные столбца и найти, какой номер столбца представляет каждый из них. то есть. если я получаю метаданные для "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
}

В чем я не уверен, так это в том, как объединить две идеи. Я хочу проверить ключ в объекте, а затем убедиться, что эти данные вставлены в правильный столбец на основе метаданных столбца.

1 Ответ

0 голосов
/ 18 октября 2019
  • В вашей электронной таблице (лист Orders) каждый столбец содержит метаданные разработчика.
    • Каждый ключ метаданных разработчика совпадает с ключами объекта, которые вы хотите поместить в электронную таблицу.
  • Вы хотите поместить значения в столбец, когдаключи и метаданные разработчика, и данные, которые вы предоставляете, совпадают.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки изменения:

  • При запуске doGet метаданные разработчика извлекаются в порядке столбца. В то время, используя ключ извлеченных метаданных разработчика, данные для помещения в электронную таблицу создаются из данных предоставления.

Модифицированный скрипт:

Когда ваш скрипт модифицируется, пожалуйста,изменить следующим образом.

С:

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 https://stackoverflow.com/a/21231012/7108653
  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()]);
  }
}

Примечание:

  • Если вышеуказанный измененный скриптНе удалось получить метаданные разработчика из вашей электронной таблицы. Добавьте метаданные разработчика в каждый столбец с помощью следующего сценария. Если вы хотите переставить ключи для столбцов, измените keys.

    function createDeveloperMetadata() {
      var columnToLetter = function(column) { // From https://stackoverflow.com/a/21231012/7108653
        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]);
      });
    }
    
  • Когда вы добавляете метаданные разработчика, пожалуйста, проверьте текущие метаданные. Поскольку к метаданным можно добавить те же ключи.

    • Если вы хотите обновить все метаданные, я рекомендую удалить их и добавить новые метаданные.
  • Когда вы изменили свой сценарий веб-приложений, пожалуйста, повторно разверните веб-приложения в качестве новой версии. Таким образом, последний скрипт отражается на веб-приложениях. Пожалуйста, будьте осторожны с этим. В вашем скрипте, когда вы тестируете скрипт с testDoGet, его повторное развертывание не требуется.

Ссылка:

Если я неправильно понял ваш вопрос, а это не то направление, в котором вы хотите, прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...