Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Json_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 表的输出指令:键顺序问题

Javascript 表的输出指令:键顺序问题,javascript,arrays,json,google-apps-script,google-sheets,Javascript,Arrays,Json,Google Apps Script,Google Sheets,我有一个JSON文件,我想将数据输出到GoogleSheet中的一个表中。由于不能保证数据顺序,我需要搜索第二个和后续数据集的对应行(下面示例中的星期二数据) 除了循环通过第一列之外,有没有更快或更优雅的方法 function test(){ var ss=SpreadsheetApp.getActiveSpreadsheet(); var SSheet=ss.getActiveSheet(); var data={Monday:{Apple:2, Orange:3}, Tues

我有一个JSON文件,我想将数据输出到GoogleSheet中的一个表中。由于不能保证数据顺序,我需要搜索第二个和后续数据集的对应行(下面示例中的星期二数据)

除了循环通过第一列之外,有没有更快或更优雅的方法

function test(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var SSheet=ss.getActiveSheet();  
  var data={Monday:{Apple:2, Orange:3}, Tuesday:{Orange:4, Apple:5}};//intentionally swap the key
  var row=2;  
  var column=2;
  var bWriteHeader=true;
  for (const g in data){
    SSheet.getRange(1,column).setValue(g)
    row=2;
    for (const k in data[g]){
      if (bWriteHeader){
        SSheet.getRange(row,1).setValue(k);
        SSheet.getRange(row,column).setValue(data[g][k]);
         row++;
      }else{
        //Search for the corresponding row--- how to do it elegantly, apart from looping thru first column?
        SSheet.getRange(row,column).setValue(data[g][k]);
      }
    }
    bWriteHeader=false;
    column++;  
  }
}

期望输出:

     Monday Tuesday
Apple   2    5
Orange  3    4

我相信你的目标如下

  • 您希望降低脚本的处理成本
虽然我不确定我提出的方法是否更优雅,但在这个答案中,下面的流程如何

  • 检索行标题
  • 检索列标题
  • 使用行标题和列标题创建数组
  • 将值放入活动工作表
  • 在此流程中,创建数组后,将数组放入电子表格。这样,我认为处理成本将低于在循环中使用
    setValue
    的脚本。当此流反映到脚本时,它将变成如下所示

    示例脚本: 测试:
    var data={星期一:{Apple:2,Orange:3},星期二:{Orange:4,Apple:5}//故意交换钥匙
    // 1. 检索行标题。
    var rowHeader=Object.keys(data.sort();
    // 2. 检索列标题。
    var colHeader=Object.keys(数据[rowHeader[0]]).sort();
    // 3. 使用行标题和列标题创建数组。
    var值=行标题.reduce((ar,k)=>ar.concat([[k,…colHeader.map(l=>data[k][l])),[[“”,…colHeader]];
    var res=values[0].map((u,i)=>values.map(r=>r[i]);
    
    console.log(res)
    我相信您的目标如下

    • 您希望降低脚本的处理成本
    虽然我不确定我提出的方法是否更优雅,但在这个答案中,下面的流程如何

  • 检索行标题
  • 检索列标题
  • 使用行标题和列标题创建数组
  • 将值放入活动工作表
  • 在此流程中,创建数组后,将数组放入电子表格。这样,我认为处理成本将低于在循环中使用
    setValue
    的脚本。当此流反映到脚本时,它将变成如下所示

    示例脚本: 测试:
    var data={星期一:{Apple:2,Orange:3},星期二:{Orange:4,Apple:5}//故意交换钥匙
    // 1. 检索行标题。
    var rowHeader=Object.keys(data.sort();
    // 2. 检索列标题。
    var colHeader=Object.keys(数据[rowHeader[0]]).sort();
    // 3. 使用行标题和列标题创建数组。
    var值=行标题.reduce((ar,k)=>ar.concat([[k,…colHeader.map(l=>data[k][l])),[[“”,…colHeader]];
    var res=values[0].map((u,i)=>values.map(r=>r[i]);
    
    console.log(res)
    @Tanaike。非常感谢您提供的代码和参考资料。我得到的比我要的还多!我不懂
    reduce
    res
    的代码。我将需要谷歌更多的阅读这些@莱昂:谢谢你的回复。我很高兴你的问题解决了。也谢谢。@Tanaike。非常感谢您提供的代码和参考资料。我得到的比我要的还多!我不懂
    reduce
    res
    的代码。我将需要谷歌更多的阅读这些@莱昂:谢谢你的回复。我很高兴你的问题解决了。也谢谢你。
    function myFunction() {
      var data = { Monday: { Apple: 2, Orange: 3 }, Tuesday: { Orange: 4, Apple: 5 } };//intentionally swap the key
    
      // 1. Retrieve a row header.
      var rowHeader = Object.keys(data).sort();
    
      // 2. Retrieve a column header.
      var colHeader = Object.keys(data[rowHeader[0]]).sort();
    
      // 3. Create an array using the row header and column header.
      var values = rowHeader.reduce((ar, k) => ar.concat([[k, ...colHeader.map(l => data[k][l])]]), [["", ...colHeader]]);
      var res = values[0].map((_, i) => values.map(r => r[i]));
    
      // 4. Put the values to the active sheet.
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      sheet.getRange(1, 1, res.length, res[0].length).setValues(res);
    }