GAS,用于从网页到电子表格中获取数据并对照保存的最后一个进行检查

问题描述 投票:0回答:2

我有一个脚本:

  • 从网页获取数据
  • 将其粘贴到电子表格中
  • 每天使用时间驱动的触发器执行

到目前为止,我有两个问题:

  1. 所需网页上的数据每天都不会刷新,我的问题是是否可以进行一些脚本无法保存的调整从网页到SS的数据(如果网页上的数据与上一个相同)保存了吗?也许要测试网页的最后一行到的最后一行电子表格?怎么做?
  2. 第二个问题是执行了脚本并保存了所有数据到SS,但我收到此消息:

“”例外:数据中的列数与范围中的列数不匹配。数据为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));
}
google-apps-script google-sheets urlfetch
2个回答
1
投票

尝试一下:

Range.getValues().filter(function(r){return r.join('').length;});

0
投票

补充答案

很久以前,我创建了一个实用程序,可以减少棘手情况下的调试时间,因为在这种情况下,必须将从一个来源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); 方法

© www.soinside.com 2019 - 2024. All rights reserved.