Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环中的函数出现问题,导致循环中断_Javascript_Json_For Loop_Google Apps Script - Fatal编程技术网

Javascript 循环中的函数出现问题,导致循环中断

Javascript 循环中的函数出现问题,导致循环中断,javascript,json,for-loop,google-apps-script,Javascript,Json,For Loop,Google Apps Script,此代码用于扫描工作表中的货币值,并基于列标题和行标题为JSON构建键/值对。因此,从本质上讲,它会找到一种货币,然后回溯行和列的编号,直到找到一个非货币、非空白值,并将其与货币一起使用以形成对。我将列出三个函数,第一个函数只是通过确定值是否为货币来启用第二个函数,第二个函数构建对象,第三个函数迭代工作表并为满足我的条件的每个工作表构建对象 每个工作表都有一个遵循此模式的名称“name\u name\u type\u location”,我的标准是任何类型为“AF”的内容 我遇到的问题是,当我在p

此代码用于扫描工作表中的货币值,并基于列标题和行标题为JSON构建键/值对。因此,从本质上讲,它会找到一种货币,然后回溯行和列的编号,直到找到一个非货币、非空白值,并将其与货币一起使用以形成对。我将列出三个函数,第一个函数只是通过确定值是否为货币来启用第二个函数,第二个函数构建对象,第三个函数迭代工作表并为满足我的条件的每个工作表构建对象

每个工作表都有一个遵循此模式的名称“name\u name\u type\u location”,我的标准是任何类型为“AF”的内容

我遇到的问题是,当我在publishedSheets()中运行tariffObject(sheets[I])时,它似乎打破了for循环,因此我只接收第一个sheet对象,即使至少有四个符合我的条件。我已经通过删除tariffObject(sheets[I])调用进行了测试,效果很好。这件事打破了我的循环

我该如何解决这个问题

function isCurr(x){
  var regex  = /^[$]\d+(?:\.\d{0,2})$/;
  if (regex.test(x)){
    return true;
  }
  else{
    return false;
  }
}

function tariffObject(sheet){
  var data = sheet.getDataRange().getDisplayValues();
  var obj = {};
  var arr = [];
  for (i=0;i<data.length;i++){
    for (j=0;j<data[i].length;j++){
      if (isCurr(data[i][j])){
        //rows
        var y = i;
        while (isCurr(data[y][j]) || data[y][j].length <= 0){          
          y = y-1;
        }
        //columns
        var x = j;
        while (isCurr(data[i][x]) || data[i][x].length <= 0){
          x = x-1;
        }
        arr.push([data[i][x],data[y][j],data[i][j]]);
      }
    }
  }
  for (k=0;k<arr.length;k++){
    if (!obj[arr[k][0]]){
      obj[arr[k][0]] = {};
    }
    if (!obj[arr[k][0]][arr[k][1]]){
      obj[arr[k][0]][arr[k][1]] = {};
    }
    obj[arr[k][0]][arr[k][1]] = arr[k][2];
  }
  return obj;
}

function publishedSheets(){
  var ss = SpreadsheetApp.openById(my spreadsheet id),
      sheets = ss.getSheets(),
      loc = {};
  for (i=0;i<sheets.length;i++){
    var name = sheets[i].getName(),
        spl = name.split("_");
    if (spl[2] == "AF"){
      loc[spl[3]] = {};
      var myObj = tariffObject(sheets[i]);
      loc[spl[3]] = myObj;
    }
  }
  Logger.log(loc);
}
函数isCurr(x){
var regex=/^[$]\d+(?:\。\d{0,2})$/;
if(正则表达式测试(x)){
返回true;
}
否则{
返回false;
}
}
函数对象(表){
var data=sheet.getDataRange().getDisplayValues();
var obj={};
var-arr=[];
对于(i=0;i试试这个:

function creatingJson() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const [hA, ...vs] = sh.getDataRange().getValues();
  let jObj = { pA: [] };
  vs.forEach((r, i) => {
    r.forEach((c, j) => {
      if (j == 0) {
        jObj[c] = {};
        jObj.pA.push(c);
      } else {
        jObj[vs[i][0]][hA[j]] = c;
      }
    });
  });
  Logger.log(JSON.stringify(jObj));
  hA.shift();
  let s = '';
  jObj.pA.forEach((p, i) => {
    s += p + "={";
    hA.forEach((h, j) => {
      if (j > 0) s += ',';
      s += h + "=" + jObj[p][h];
    });
    s+='}\n';
  });
  Logger.log(s);

}
表1:

H1 氢 H3 H4 H5 H6 H7 H8 H9 H10 R1 1. 11 21 31 41 51 61 71 81 91 R2 2. 12 22 32 42 52 62 72 82 92 R3 3. 13 23 33 43 53 63 73 83 93 R4 4. 14 24 34 44 54 64 74 84 94 R5 5. 15 25 35 45 55 65 75 85 95 R6 6. 16 26 36 46 56 66 76 86 96 R7 7. 17 27 37 47 57 67 77 87 97 R8 8. 18 28 38 48 58 68 78 88 98 R9 9 19 29 39 49 59 69 79 89 99 R10 10 20 30 40 50 60 70 80 90 100
两个
,而
for的
循环中的
循环
for的
循环中的
循环尖叫着“反模式”。无论你想做什么,肯定还有另一种方法。while循环在同一级别上,而不是在彼此之间,它们分别决定行标题和列标题。我相信for循环中的for循环在迭代电子表格时非常常见。虽然我同意无疑有更好的方法,但这部分是有效的。我没有说
while
循环相互嵌套。但是一个
for
循环应该做行,另一个应该做列,所以嵌套的
while
循环似乎不正确。如果它们是用于标题,它们应该在获取内容的循环之外。嗯,标题不在固定位置列数和行数可能不同,电子表格中货币表的位置也可能不同。我最简单的解决方案是找到货币值并获取与之相关的标题。因为它未知,我想不出更好的方法。如果你有想法,我很乐意测试它。你能提供一个imag吗电子表格的e?这几乎完美。唯一的问题是随着时间/区域的变化而变化的底部行。JSON需要是:周一-周五0800-1700={区域a=$40.00,区域B=$55.00,区域C=$65.00,区域D=$90.00}而我得到的是:时间={最低费用=,100=,1000=,2000=区域a,3000=区域B,5000=区域C,CAP区域D}星期一星期五0800-1700={最低收费=100=,1000=,2000=403000=555000=65,上限=90}但这是一段很好的代码。谢谢!我不会尝试用同一个脚本执行不同的范围。当我使用复杂的电子表格时,我总是要求我控制某些单元格,我可以使用这些单元格以编程方式确定在何处可以找到范围。如果客户不给我所需的内容,我就走过去让他们知道另一个选择是以我听Bruce McPherson描述过的方式使用元数据,但这完全超出了我的理解范围,我不打算学习它。我总是在尽可能简化代码的基础上构建自己的工作。另一个问题是,这只是整个工作表的一小部分,我无法理解因此,它需要在工作表中进行迭代,以编程方式告知从何处开始创建JSON,我认为通过查找currency最简单,因为它是我所需要的唯一的