Google表格 - 将单元格内容拆分为行和列

时间:2016-01-17 19:29:24

标签: google-apps-script google-sheets

关联的Google表格:https://docs.google.com/spreadsheets/d/1j2P2V0SCiE7QtK7kdCorpLfYQPFRghKMw4tuCYbqce0/edit?usp=sharing

我有一个表单,可以将所有产品和数量输出到一个单元格中:

"产品:NF900XC,数量:3 产品:NF900,数量:2 产品:N1930CB,数量:2 产品:N2120,数量:1 产品:NLPCR200,数量:2 产品:N272,数量:2"

我需要各自的产品和数量以及相应的相关数据集。

我希望将内容(列O)拆分为各自的列:

W/BroadcastQueue: Reject to launch app .../10186 for broadcast: App Op 60

我在名字姓氏上使用了{{1}}命令,但我不确定在这种情况下如何将其余文本解析为行和列。

我还将在功能上复制带有时间戳的行

A栏

提交日期

对应于产品:单元格O中的数量

我希望这是有道理的。

2 个答案:

答案 0 :(得分:2)

以下是我测试过的一些代码,它可以运行。代码删除了所有单词" Product:",并用逗号替换它们。然后代码执行与字符串" Quantity:"类似的东西,用空字符串替换它。接下来,它创建一个数组,并将数组转换为二维数组,以便可以在一个动作中写入行和列。

function convertData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('Form Submission');

  var data = sh.getRange("O2").getValue();
  //Logger.log(data);
  var firstProductRemoved = data.replace("Product: ", "");
  //Logger.log(firstProductRemoved);

  var allProductReplacedWithComma = firstProductRemoved.replace(/Product: /g,",");
  //Logger.log(allProductReplacedWithComma);

  var allQuantityReplacedWithNothing = allProductReplacedWithComma.replace(/Quantity: /g,"");
  //Logger.log(allQuantityReplacedWithNothing);

  var dataAsArray = allQuantityReplacedWithNothing.split(",");

  var outerArray = [], innerArray = [];
  var i=0;

  for (i=0;i<dataAsArray.length;i+=2) {
    innerArray = []; //reset every loop

    innerArray.push(dataAsArray[i]);
    innerArray.push(dataAsArray[i+1]);
    outerArray.push(innerArray);
  };
  //Logger.log(outerArray);

  var orderItemsSh = ss.getSheetByName('Order Items');
  orderItemsSh.getRange(orderItemsSh.getLastRow()+1, 15,outerArray.length, 2).setValues(outerArray);
};

答案 1 :(得分:0)

您可能对更通用的解决方案感兴趣,而不是需要依赖于知道输入字符串中特定措辞的解决方案。

kvStringToArray()函数将返回一个数组,该数组可以直接写入使用Range.setvalues()的电子表格。它是纯JavaScript,因此也可以在Google Apps脚本环境之外使用。

RegExp用于连续识别输入数据中的键:值对,并且该函数假定有“行”信息可以通过重复已发现的“键”来识别。

var formInput = "Product: NF900XC, Quantity: 3 Product: NF900, Quantity: 2 Product: N1930CB, Quantity: 2 Product: N2120, Quantity: 1 Product: NLPCR200, Quantity: 2 Product: N272, Quantity: 2";
snippet.log(
  JSON.stringify(
    kvStringToArray(formInput)));

/**
 * Convert a given string of key:value pairs into a two-dimensional
 * array, with keys as headers, and "items" as rows.
 * From: http://stackoverflow.com/a/34847199/1677912
 *
 * @param {string} str    A string containing key:value pairs.
 *
 * @returns {string[][]}  A two-dimensional array of strings.
 */
function kvStringToArray( str ) {
  var re = /\s*(\w*?)\s*:\s*([^,\s]*)/g,  // See https://regex101.com/r/kM7gY1/1
      arr,           // array to capture key:value pairs
      data = [],     // array to return table
      row = [],      // array for building table rows
      headers = [];  // array of unique keys, for table header
  
  // Use a RegEx to identify individual key:value pairs
  while ((arr = re.exec(str)) !== null) {
    var key = arr[1];   // $1 matches key
    var value = arr[2]; // $2 matches value
    // Check if we should start a new row
    if (headers.indexOf(key) == 0) {
      data.push(row);
      row = [];
    }
    // Save this value in row
    row.push(value);
    // If this is the first time we've seen this key, add it to headers.
    if (headers.indexOf(key) == -1) headers.push(key);
  }
  data.push(row);  // save last row
  data.unshift(headers); // add headers

  return data;
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>