我有一个脚本:
到目前为止,我有两个问题:
“”例外:数据中的列数与范围中的列数不匹配。数据为1,但范围为8。(第115行,文件“代码”)“
代码的第115行是:
eigenSheet.getRange(eigenRow, 1, eigenValues.length, eigenValues[0].length).setValues(eigenValues);
我认为问题可能是网页上有时我有空行?这是一个问题还是其他,以及如何解决?
整个脚本代码在这里:
regularSheetName = "Regular method";
eigenSheetName = "EIGENVECTOR Analysis";
function updateSheet(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var regularSheet = ss.getSheetByName(regularSheetName);
var eigenSheet = ss.getSheetByName(eigenSheetName);
var date = Utilities.formatDate(new Date(), 'CET', "dd.MM.yyyy");
var content = UrlFetchApp.fetch("link").getContentText().split('======================================================================================================');
if(content.length<2){
return SpreadsheetApp.getUi().alert("Unable to fetch data.");
}
var strLines = content[1].split("\n");
var regularValues = [];
var eigenValues = [];
var isRegular = true;
var ignore = false;
for(var i=1;i<strLines.length;i++){
var str = strLines[i];
if(str.length<10){
if(isRegular){
ignore = true;
}else{
continue;
}
}else if(str.indexOf("EFAVORITE")>-1){
ignore = false;
isRegular = false;
i++;
str = strLines[i];
}else if(str.indexOf("endfile")>-1){
ignore = true;
}
if(!ignore){
if(isRegular){
//process regular method rows
var lineSplit = str.split(" ");
var row = [date];
var curVal = "";
for(var j=0;j<lineSplit.length;j++){
if(lineSplit[j]===""){
continue;
}
if((row.length==1&&curVal==="")||(isWord(lineSplit[j])&&isWord(lineSplit[j-1]))){
if(curVal!=""){
curVal += " ";
}
curVal += lineSplit[j];
}else{
row.push(curVal);
curVal = lineSplit[j].replace(".", ",");
}
}
row.push(curVal);
regularValues.push(row);
}else{
//process eigen rows
var lineSplit = str.split(" ");
var row = [];
var curVal = "";
for(var j=0;j<lineSplit.length;j++){
if(lineSplit[j]===""){
continue;
}
if((row.length==0&&curVal==="")||(isWord(lineSplit[j])&&isWord(lineSplit[j-1]))){
if(curVal!=""){
curVal += " ";
}
curVal += lineSplit[j];
}else{
if(row.length==1&&curVal!="@"&&curVal!="N@"&&curVal!="N"){
row.push("");
}
if(row.length>0){
row.push(curVal);
}else{
row.push(date);
}
curVal = lineSplit[j].replace(".", ",");
}
}
if(row.length==6&&curVal!="@"){
row.push("");
}
row.push(curVal);
eigenValues.push(row);
}
}
}
//append to sheets
var regRow = regularSheet.getLastRow()+1;
regularSheet.getRange(regRow, 1, regularValues.length, regularValues[0].length).setValues(regularValues);
var eigenRow = eigenSheet.getLastRow()+1;
eigenSheet.getRange(eigenRow, 1, eigenValues.length, eigenValues[0].length).setValues(eigenValues);
}
function isWord(checkStr){
return (checkStr.indexOf("%")==-1 && checkStr!="@" && checkStr!="N@" && checkStr!="N" && isNaN(checkStr));
}
尝试一下:
Range.getValues().filter(function(r){return r.join('').length;});
补充答案
很久以前,我创建了一个实用程序,可以减少棘手情况下的调试时间,因为在这种情况下,必须将从一个来源Range
接收的一组值应用于另一个来源:
/**
* @summary checks if range can accept an array of values
* @param {GoogleAppsScript.Spreadsheet.Range} rng
* @param {any[][]} values
* @returns {boolean}
*/
const checkBounds = (rng, values) => {
const targetRows = rng.getHeight();
const targetCols = rng.getWidth();
const { length } = values;
const [firstRow] = values;
return length === targetRows &&
firstRow.length === targetCols;
};
空行
除了Cooper的答案,您还可以利用Boolean()
构造函数对虚假值返回false的事实检查行是否为空(您必须小心,因为该行充满了Boolean()
s也将被过滤掉):
0
或仅使用内置方法服务
const isEmpty = (row) => row.every(Boolean);
方法