Google Apps脚本内部加入范围

时间:2015-04-02 02:13:18

标签: javascript google-apps-script

我想通过“ID”“内连接”2个数据范围(SHEET 1& 2),并将其结果输出到SHEET 3中(如下所示)

对于所有工作表,第一行只是标题,实际值从第二行开始。

工作表1是整个数据库(3000行),工作表2(1000行)是选择具有附加数据的工作表1。每个条目(ID)仅在每个工作表中出现一次。

工作表3应显示仅包含工作表2的行,但包含工作表1的相应行(按ID)的数据。

var sheetOneVals = sheetOne.getDataRange().getValues(); sheetOneVals.splice(0, 1);

var sheetTwoVals = sheetTwo.getDataRange().getValues(); sheetTwoVals.splice(0, 1);

如何做到这一点? https://stackoverflow.com/a/17500836/379777几乎是我想要的,除了它使用Keys,我个人没有。

表1:

     A         B           C      D
  ------------------------------------
1 | Name | Description | Price | ID  |
  ------------------------------------
2 | ABC  | Bla1        | 10    | 123 |
  ------------------------------------
3 | DEF  | Bla2        | 8     | 234 |
  ------------------------------------  
: | :    | :           | :     | :   |
: | :    | :           | :     | :   |
  ------------------------------------          

第2页:

    A     B      C     D         E
  ---------------------------------------
1 | ID  | Cat1 | Cat2 | Cat3 | Nonsense |
  ---------------------------------------   
2 | 123 | B    | C    | D    | xyz      |
  ---------------------------------------
: | :   | :    | :    | :    | :        |
: | :   | :    | :    | :    | :        |
  ---------------------------------------   

第3页(预期结果):

     A       B      C     D       E         F         G
  ----------------------------------------------------------
1 | ID   | Cat1 | Cat2 | Cat3 | Name | Description | Price |
  ----------------------------------------------------------    
2 | 123  | B    | C    | D    | ABC  | Bla1        | 10    |
  ----------------------------------------------------------
: | :    | :    | :    | :    | :    | :           | :     |
: | :    | :    | :    | :    | :    | :           | :     |
  ----------------------------------------------------------

2 个答案:

答案 0 :(得分:1)

您只想要逻辑或某人编写所有代码?能够轻松快速地运行的逻辑是:

以钥匙作为身份证开始和对象 迭代槽板1并将所有值保存为这些ID中的对象 通过表格2迭代再次保存ID中的新密钥 将对象解析为Double Array。

这里有一些存根:

Initiate myObject
Get Sheet1 and sheet2
for( lines in sheet 1 )
  myObject[ lineId ] = {}
    for( cols in sheet 1[lines] )
      myObject[ lineId ][ columnHeading ] = columnValue

for( lines in sheet 2 )
  for( cols in sheet 1[lines] )
    myObject[ lineId ][ columnHeading ] = columnValue

你最终会得到一个副本ID,作为属性键及其中带有值的属性,但没有大问题。

Initiate arrayToPaste
Initiate currLine with 0
for( props in myObject )
  Initiate first array key as an Array
  for( keys in myObject[ props ] ){
    arrayToPaste[ currLine ].push(myObject[ props ][ key ])
  }
  Increase currLine

Paste arrayToPaste to sheet

只需将Heading插入某处,可以在Initialization中,在第一个for之后,粘贴时,作为一个不同的数组等...

我也有一个问题,为什么是parseInt?

答案 1 :(得分:0)

我最终得到了以下解决方案。我可能不够完全理解你的解决方案。我相信你的解决方案要快得多。

function createSheet3(){
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("sheet1");
  var sheet2 = ss.getSheetByName("sheet2");
  var sheet3 = ss.getSheetByName("sheet3");

  var sheet3Header = [Name,Description,Price,ID,ID,Cat1,Cat2,Cat3,Nonsense]

  var sheetOneVals = sheet1.getDataRange().getValues();
  sheetOneVals.splice(0, 1);

  var sheetTwoVals = sheet2.getDataRange().getValues();
  sheetTwoVals.splice(0, 1);

  var consolidatedArr = new Array();

  for each (var item in sheetTwoVals){  
   for (var i in sheetOneVals) {
     if(item[0] == sheetOneVals[i][3]){
       consolidatedArr.push(sheetOneVals[i].concat(item));
     }
    }
  }
  sheet3.clear({contentsOnly:true});
  sheet3.getRange(1,1,1,9).setValues(sheet3Header);
  sheet3.getRange(2,1,consolidatedArr.length,9).setValues(consolidatedArr);


  SpreadsheetApp.flush();                          
  Utilities.sleep("200"); 
  if(consolidatedArr.length > 0){
    var last = sheet3.getLastRow();                     
    var max  = sheet3.getMaxRows();
    if (last !== max && max-last > 1) {sheet3.deleteRows(last+2,max-last-1);}
  }
}