使用Google Sheets和Appscript将BigCartel csv文件中的列拆分为长格式



许多个月前我问过这个问题,R将BigCartel csv文件中的列拆分为数据帧或数据表中的长格式

我已经粘贴了下面的问题描述:

大卡特尔有一个选项,可以将订单导出到csv文件中。然而,对于我需要做的分析来说,结构不是很好。

以下是大卡特尔csv订单下载中的列和行的子集(还有其他列对当前问题不重要)。

Number, Buyer name,Items,Item count,Item total,Total price,Total shipping,Total tax,Total discount
1,jim,product_name:Plate|product_option_name:Red|quantity:1|price:9.99|total:9.99,1,9.99,11.98,1.99,0,0
2,bill,product_name:Plate|product_option_name:Green|quantity:1|price:9.99|total:9.99;product_name:Plate|product_option_name:Blue|quantity:1|price:9.99|total:9.99,2,19.98,22.98,3,0,0
3,jane,product_name:Plate|product_option_name:Red|quantity:1|price:6.99|total:6.99;product_name:Thingy|product_option_name:|quantity:1|price:9.99|total:9.99;product_name:Mug|product_option_name:Grey|quantity:1|price:10.99|total:10.99;product_name:Cup|product_option_name:Grey|quantity:1|price:9.99|total:9.99;product_name:Saucer|product_option_name:Grey|quantity:1|price:9.99|total:9.99;product_name:Stopper|product_option_name:|quantity:1|price:9.99|total:9.99,6,57.94,64.94,7,0,0
4,dale,product_name:Plate|product_option_name:Green|quantity:1|price:10.99|total:10.99,1,10.99,13.99,4.99,0,1.99

项目列可以具有多个"项目";行项目";以分号(;)作为分隔符。每个";行项目";有五个用管道(|)分隔的属性,即product_name、product_options_name、quantity、price和total(即行)。有一列,";项目计数";,这给出了"0"的数目;行项目";加上(订单)总价、运费、税费和折扣栏。为了进行分析,我希望数据采用以下长格式,其中运费、税费和折扣也被视为"产品项目"。

Number Buyer name line-item    product_option_name quantity price total
1      jim        Plate        Red                 1        9.99  9.99
1      jim        shipping                         1        1.99  1.99
1      jim        tax                              0        0     0
1      jim        discount                         0        0     0
2      bill       Plate        Green               1        9.99  9.99
2      bill       Plate        Blue                1        9.99  9.99
2      bill       shipping                         1        3     3
2      bill       tax                              0        0     0
2      bill       discount                         0        0     0
3      jane       Plate        Red                 1        6.99  6.99
3      jane       Thingy                           1        9.99  9.99
3      jane       Mug          Grey                1        10.99 10.99
3      jane       Cup          Grey                1        9.99  9.99
3      jane       Saucer       Grey                1        9.99  9.99
3      jane       Stopper                          1        9.99  9.99
3      jane       shipping                         1        7     7
3      jane       tax                              0        0     0
3      jane       discount                         0        0     0
4      dale       Plate        Green               1        10.99 10.99
4      dale       shipping                         1        4.99  4.99
4      dale       tax                              0        0     
4      dale       discount                         0        -1.99 -1.99

我想知道是否有人可以在Apps脚本中提出一个解决方案,以获得谷歌表单作为结果表。

感谢

Martyn

试试这个:

function cartelcsv() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
const fdr2 = DriveApp.getFolderById(gobj.globals.folder2id);//csv files folder
const files = fdr2.getFilesByType(MimeType.CSV);
let obj = { pA: [] };//data collection container
while (files.hasNext()) {
let f = files.next();
let c = f.getBlob().getDataAsString();//collecting data from each file in the folder
let ls = c.split(/rn/);
let hdr = ls.shift();
ls.forEach((line, i) => {
let l = line.split(",")
let pre = l.splice(0, 2);
let pos = l.splice(-6, 6);
l = l[0].toString();
let slA = l.split(";")
slA.forEach((s, j) => {
let r = s.split("|").map(e => e.slice(e.indexOf(':') + 1));
if (j == 0) {
obj[`${pre[0]}-${pre[1]}`] = { Number: pre[0], Buyer: pre[1], Purchases: [{ name: r[0], option: r[1], quantity: r[2], price: r[3], total: r[4] }], count: pos[0], ttl: pos[1], ttlwtax: pos[2], shipping: pos[3], tax: pos[4], discount: pos[5] };
obj.pA.push(`${pre[0]}-${pre[1]}`)
} else {
obj[`${pre[0]}-${pre[1]}`].Purchases.push({ name: r[0], option: r[1], quantity: r[2], price: r[3], total: r[4] });
}
});
});
}
let oA = [["Number", "Buyer Name", "Line-Item", "ProductOptionName", "Quantity", "Price", "Total"]];
obj.pA.forEach(p => {
obj[p].Purchases.forEach((o, i) => {
oA.push([obj[p].Number, obj[p].Buyer, o.name, o.option, o.quantity, o.price, o.total]);
});//display all of the data in the collection object
oA.push([obj[p].Number, obj[p].Buyer, "shipping", '', '', obj[p].shipping, obj[p].shipping]);
oA.push([obj[p].Number, obj[p].Buyer, "tax", '', '', obj[p].tax, obj[p].tax]);
oA.push([obj[p].Number, obj[p].Buyer, "discount", '', '', obj[p].discount, obj[p].discount]);
});
sh.clearContents();
sh.getRange(1, 1, oA.length, oA[0].length).setValues(oA)
}

输出:

数量
1122222333333333444

最新更新