javascript - Google Appscript 从一列转置动态数据组
问题描述
我一直在想办法弄清楚如何编写这个脚本来将数据从一张非常脏的纸上转换到另一张纸上。
还有其他类似的问题,但似乎没有一个像我的特定用例。
这是工作表当前的结构(有点):
这里最大的问题是我不知道一个特定的数据组会有多少行,但我知道每组数据之间总是有一堆空白行。
我找到了一个让我走了一半的脚本:
function myFunction() {
//Get values of all nonEmpty cells
var ss = SpreadsheetApp.getActiveSheet();
var values = ss.getRange("D:D").getValues().filter(String);
//Create object with 3 columns max
var pasteValues = [];
var row = ["","",""];
for (i = 1; i<values.length+1; i++){
row.splice((i%3)-1,1,values[i-1]);
if(i%3 == 0){
pasteValues.push(row);
var row = ["","",""]
}
}
if(row != []){
pasteValues.push(row)
}
//Paste the object in columns A to C
ss.getRange(1,1,pasteValues.length,pasteValues[0].length).setValues(pasteValues);
}
但在那种情况下,询问者数据集是固定的。我可以粗略地说,每个组的最大行数是 10(这是在浏览了 3000 行工作表之后的假设……但如果脚本可以自动知道这一点,那么它会更加动态)。所以考虑到这一点......在屠宰脚本之后......我想出了这个......这绝不会按照目前的方式工作(并非所有数据都被复制):
function myFunction() {
var copyfrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyfrom')
var copyto = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyto')
var values = copyfrom.getRange("A:A").getValues().filter(Array);
var pasteValues = [];
var row = [];
for (i = 1; i<values.length; i++){
if(values[i] != ""){
row.push(values[i])
}
Logger.log(row);
if(i%10 == 0){
pasteValues.push(row);
row = []
}
}
if(row != []){
pasteValues.push(row)
}
copyto.getRange(1,1,pasteValues.length,pasteValues[0].length).setValues(pasteValues);
}
我很确定我可能仍然应该使用 array.splice() 但没有成功尝试实现它以实现我想要的,这是转置表的外观:
信息:
- “copyfrom”表中的每组地址将由至少 1 个空白行分隔
- 地址组的长度不是静态的,有的可以有 5 行,有的可以有 8 行,但地址组总是用空白行分隔
任何帮助表示赞赏
解决方案
解决方案:
假设每个新行都以 开头Name
,您可以使用此脚本重新排列列:
function myFunction() {
var copyfrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyFrom');
var copyto = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyTo');
var lastRow = copyfrom.getLastRow();
var values = copyfrom.getRange(1,1,lastRow).getValues().filter(Array);
var pasteValues = [];
var row = [];
var maxLen = 1;
// rearrange rows
for (i = 0; i < values.length; i++) {
if (values[i] == "Name" && i > 0) {
pasteValues.push(row);
row = [values[i]];
}
else if (values[i] != "") {
row.push(values[i]);
if (row.length > maxLen) {
maxLen = row.length;
}
}
}
pasteValues.push(row);
// append spaces to make the row lengths the same
for (j = 0; j < pasteValues.length; j++) {
while (pasteValues[j].length < maxLen) {
pasteValues[j].push('');
}
}
copyto.getRange(1,1,pasteValues.length,maxLen).setValues(pasteValues);
}
示例 I/O:
推荐阅读
- javascript - 将 Integer[] 列表从 ajax 发送到 Spring Controller
- emacs - Emacs 组织模式习惯 - 4 天中的 3 天
- outlook - 使用 Office.js 更新电子邮件正文时,如何防止在 Outlook Web App 中丢弃 base 64 格式的签名图像?
- apache - Apache Flume 在同一源上具有 2 个不同的拦截器
- android - 相机图片uri上的光标错误
- r - 确定 ggplot2 绘图区域的宽度
- c - 倒回 VT100 终端命令中的一段文本
- angular - Angular 2 ngModel 使用 ngFor 提交
- ios - 通过按钮替换 ViewController,线程 1:EXC_BAD_INSTRUCTION
- google-apps-script - Google Sheets Apps 脚本 > 查找图像比例