如何使用 google 脚本将学生标记 .txt 数据解析为 google sheet
How to Parse student marks .txt data to google sheet using google script
我有多个 .txt 文件,其中包含每个科目的学生分数。
我想使用 google 脚本将学生分数解析为 google sheet,输出应该是这样的。
- 学生成绩sheet.
我对列的范围有疑问,因为每个学生选修的科目数量不同。解析方法有什么建议吗?
sheet.getRange(lastRow +1,5,mark.length,marks[1].length).setValues(mark);
试试这个。代码更新。如果学生最多有 8 个科目。 (您可以更改为 10 或 50)
const file = DriveApp.getFileById('ID').getBlob().getDataAsString();
const data = Utilities.parseCsv(file,'|');
const arr = []
const index = [] //0,7,12
for(let i =0; i< data.length;i++){
if(data[i].toString().includes('*')){
index.push(i);
}
}
const arr1 = []
for (let i =0;i< index.length;i++){
const start = index[i];
const end = index[i+1]
if(i+1 > index.length){
arr1.push(data.slice(end))
}else{
arr1.push(data.slice(start,end))
}
}
const finalarr = []
for(let i=0; i< arr1.length;i++){
const transit = []
for(let j=0;j<arr1[i].length;j++){
if(j == 0){
transit.push(arr1[i][j][0],arr1[i][j][2])
}else{
transit.push(arr1[i][j][0].split(':')[1])
}
}
//change the max subject length in here. Replace 8 with your desired numbers
const arr_new = new Array(8)
const arr_desired_length = transit.concat(arr_new.slice(transit.length))
finalarr.push(arr_desired_length)
}
finalarr.forEach(r =>{
if(r[0].includes('*')){
r[0] = r[0].replace('*','')
}
})
//sheet.getRange(lastRow +1,5,finalarr.length,finalarr[0].length).setValues(finalarr);
console.log(finalarr)
//OUTPUT in the same length
[ [ 'ELMI ALSA', '89.0', '60', '88', '78', '68', '89', '70' ],
[ 'EMMY JOE', '80.0', '86', '84', '89', '90', , ],
[ 'ELIZA MOHRE', '73', '60', '70', , , , ] ]
当我看到您的示例图片时,我猜想您当前的问题可能是由于要放入电子表格的值中每个元素的数组长度所致。如果我的理解是正确的,下面的修改怎么样?
发件人:
sheet.getRange(lastRow +1,5,mark.length,marks[1].length).setValues(mark);
收件人:
const maxLen = Math.max(...mark.map(r => r.length));
const values = mark.map(r => r.length < maxLen ? [...r, ...Array(maxLen - r.length).fill("")] : r);
sheet.getRange(lastRow + 1, 5, values.length, values[1].length).setValues(values);
- 在此修改中,您的值的每个长度都变得相同。这样,
setValues
就可以使用了。
注:
- 在您的显示脚本中,似乎使用了
mark
和 marks
。从您的脚本中,我了解到 mark
是放入电子表格的值。
参考:
我有多个 .txt 文件,其中包含每个科目的学生分数。
我想使用 google 脚本将学生分数解析为 google sheet,输出应该是这样的。
- 学生成绩sheet.
我对列的范围有疑问,因为每个学生选修的科目数量不同。解析方法有什么建议吗?
sheet.getRange(lastRow +1,5,mark.length,marks[1].length).setValues(mark);
试试这个。代码更新。如果学生最多有 8 个科目。 (您可以更改为 10 或 50)
const file = DriveApp.getFileById('ID').getBlob().getDataAsString();
const data = Utilities.parseCsv(file,'|');
const arr = []
const index = [] //0,7,12
for(let i =0; i< data.length;i++){
if(data[i].toString().includes('*')){
index.push(i);
}
}
const arr1 = []
for (let i =0;i< index.length;i++){
const start = index[i];
const end = index[i+1]
if(i+1 > index.length){
arr1.push(data.slice(end))
}else{
arr1.push(data.slice(start,end))
}
}
const finalarr = []
for(let i=0; i< arr1.length;i++){
const transit = []
for(let j=0;j<arr1[i].length;j++){
if(j == 0){
transit.push(arr1[i][j][0],arr1[i][j][2])
}else{
transit.push(arr1[i][j][0].split(':')[1])
}
}
//change the max subject length in here. Replace 8 with your desired numbers
const arr_new = new Array(8)
const arr_desired_length = transit.concat(arr_new.slice(transit.length))
finalarr.push(arr_desired_length)
}
finalarr.forEach(r =>{
if(r[0].includes('*')){
r[0] = r[0].replace('*','')
}
})
//sheet.getRange(lastRow +1,5,finalarr.length,finalarr[0].length).setValues(finalarr);
console.log(finalarr)
//OUTPUT in the same length
[ [ 'ELMI ALSA', '89.0', '60', '88', '78', '68', '89', '70' ],
[ 'EMMY JOE', '80.0', '86', '84', '89', '90', , ],
[ 'ELIZA MOHRE', '73', '60', '70', , , , ] ]
当我看到您的示例图片时,我猜想您当前的问题可能是由于要放入电子表格的值中每个元素的数组长度所致。如果我的理解是正确的,下面的修改怎么样?
发件人:
sheet.getRange(lastRow +1,5,mark.length,marks[1].length).setValues(mark);
收件人:
const maxLen = Math.max(...mark.map(r => r.length));
const values = mark.map(r => r.length < maxLen ? [...r, ...Array(maxLen - r.length).fill("")] : r);
sheet.getRange(lastRow + 1, 5, values.length, values[1].length).setValues(values);
- 在此修改中,您的值的每个长度都变得相同。这样,
setValues
就可以使用了。
注:
- 在您的显示脚本中,似乎使用了
mark
和marks
。从您的脚本中,我了解到mark
是放入电子表格的值。