复制特定值并根据条件粘贴到Google表格中另一个工作表的特定单元格中

时间:2017-03-18 07:38:11

标签: google-apps-script

我在" Sheet1"。

中有以下结构的表格

enter image description here

Date         CQ %    LR%     UD %    DP %   DSI %    UB %   DDD %
26-Feb-2017 0.49%   0.15%   0.37%   0.53%   0.31%   0.82%   4.09%
27-Feb-2017 0.51%   0.12%   0.46%   0.71%   0.36%   0.91%   4.06%
28-Feb-2017 0.56%   0.18%   0.50%   0.72%   0.33%   0.93%   3.28%
1-Mar-2017  0.62%   0.13%   0.42%   0.75%   0.34%   0.94%   5.08%
2-Mar-2017  0.59%   0.12%   0.42%   0.76%   0.35%   0.99%   5.12%
3-Mar-2017  0.62%   0.13%   0.50%   0.80%   0.32%   0.91%   5.33%
4-Mar-2017  0.72%   0.22%   0.52%   1.49%   0.37%   1.08%   4.05%
5-Mar-2017  0.68%   0.17%   0.43%   0.74%   0.35%   1.01%   4.76%
6-Mar-2017  0.63%   0.18%   0.55%   0.88%   0.38%   1.02%   4.88%
7-Mar-2017  0.56%   0.19%   0.41%   0.75%   0.33%   0.91%   4.76%

In" Sheet 2"来自" Sheet1"的值将被复制并粘贴在下面提到的特定格式和条件下。

Condition (>=)

CQ %    LR%    UD%     DP%    DSI%   UB%    DDD%  Rating
0.58%  0.17%  0.47%   0.75%   0.35%  0.93%  4.50%  4.57

将被复制的格式

Date        Metric    Value
27-02-2017   DSI      0.36%
28-02-2017   CQ       0.56%
28-02-2017   LR       0.18%
28-02-2017   UD       0.50%
28-02-2017   UB       0.93% 
01-03-2017   CQ       0.62%
01-03-2017   DP       0.75%
01-03-2017   UB       0.94% etc

1 个答案:

答案 0 :(得分:0)

选择存储在关联数组中的标准数据

我创建了三页数据,标准和输出。我使用了一个关联数组来保持标准'标准'表和我使用关联数组的键作为数据表上的数据表的标题。片。最后,我通过使用outputA数组的高度和必要的3列输出来获得最终输出范围的大小。

function listSelectedValues()
{
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var data=ss.getSheetByName('Data');
  var crit=ss.getSheetByName('Criteria')
  var dataA=data.getDataRange().getValues();
  var critA=crit.getDataRange().getValues();
  var dictA={};
  var outputA=[];
  var outputS=ss.getSheetByName('Output');
  for(var i=0;i<critA[0].length;i++)
  {
    dictA[critA[0][i]]=critA[1][i];  //this builds a criteria dictionary or lookup table
  }
  /* This is just debugging stuff to make sure I got the associative array correct and yes I did include the rating but it's not one of the columns so it never gets used.
  var s='{';
  var firstTime=true;
  for(var key in dictA)
  {
    if(!firstTime)s+=',';
    else firstTime=false;
    s+=key + ':' + dictA[key];
  }
  s+='}'
  dispStatus('dictA',s,800,600);
  */
  for(var i=1;i<dataA.length;i++)//skip over the dates i starts at 1
  {
    for(var j=1;j<dataA[i].length;j++)//skip over the keys j starts at 1
    {
      if(dataA[i][j]>=dictA[dataA[0][j]])//this is possible because I used column headers that are keys in the associative array (dictA)
      {
        outputA.push([dataA[i][0],dataA[0][j],dataA[i][j]]); //notice the extra array bracket for inserting an entire row and insuring a 2 dimensional array for the coming setValues command.
      }
    }
  }
  var outputR=outputS.getRange(1, 1, outputA.length, 3);
  outputR.setValues(outputA);
}

您可能希望对此进行修改,以便您可以使标题行对您的读者更有意义,但这会使标题元素的使用变得复杂,成为关联数组的键。我尽可能选择阻力最小的路径。

我包含了我使用的dispStatus例程。

function dispStatus(title,html,width,height,modal)
{
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 400;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var modal = typeof(modal) !== 'undefined' ? modal : false;
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
 if(!modal)
 {
   SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
 }
 else
 {
   SpreadsheetApp.getUi().showModalDialog(htmlOutput, title);
 }
} 

没有格式化的最终输出看起来像这样。

2/27/2017   DSI 0.36
2/28/2017   LR  0.18
2/28/2017   UD  0.5
2/28/2017   UB  0.93
3/1/2017    CQ  0.62
3/1/2017    DP  0.75
3/1/2017    UB  0.94
3/1/2017    DDD 5.08
3/2/2017    CQ  0.59
3/2/2017    DP  0.76
3/2/2017    DSI 0.35
3/2/2017    UB  0.99
3/2/2017    DDD 5.12
3/3/2017    CQ  0.62
3/3/2017    UD  0.5
3/3/2017    DP  0.8
3/3/2017    DDD 5.33
3/4/2017    CQ  0.72
3/4/2017    LR  0.22
3/4/2017    UD  0.52
3/4/2017    DP  1.49
3/4/2017    DSI 0.37
3/4/2017    UB  1.08
3/5/2017    CQ  0.68
3/5/2017    LR  0.17
3/5/2017    DSI 0.35
3/5/2017    UB  1.01
3/5/2017    DDD 4.76
3/6/2017    CQ  0.63
3/6/2017    LR  0.18
3/6/2017    UD  0.55
3/6/2017    DP  0.88
3/6/2017    DSI 0.38
3/6/2017    UB  1.02
3/6/2017    DDD 4.88
3/7/2017    LR  0.19
3/7/2017    DP  0.75
3/7/2017    DDD 4.76

我希望这对你有所帮助。

好的,我在这个版本中添加了最后的扭曲。

function listSelectedValues()
{
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var data=ss.getSheetByName('Data');
  var crit=ss.getSheetByName('Criteria')
  var dataA=data.getDataRange().getValues();
  var critA=crit.getDataRange().getValues();
  var dictA={};
  var outputA=[];
  var outputS=ss.getSheetByName('Output');
  for(var i=0;i<critA[0].length;i++)
  {
    dictA[critA[0][i]]=critA[1][i];  //this build a criteria dictionary or lookup table
  }
  for(var i=1;i<dataA.length;i++)
  {
    for(var j=1;j<dataA[i].length;j++)
    {

      if((j<dataA[i].length-1)&&(dataA[i][j]>=dictA[dataA[0][j]])||((j=dataA[i].length-1)&&(dataA[i][j]<dictA[dataA[0][j]])))
      {
        outputA.push([dataA[i][0],dataA[0][j],dataA[i][j]]); 
      }
    }
  }
  var outputR=outputS.getRange(1, 1, outputA.length, 3);
  outputR.setValues(outputA);
  var end = 'is near';
}

这是我的测试数据。

Date    CQ  LR  UD  DP  DSI UB  DDD Rating
26-Feb-2017 0.49    0.15    0.37    0.53    0.31    0.82    4.09    5.00
27-Feb-2017 0.51    0.12    0.46    0.71    0.36    0.91    4.06    4.90
28-Feb-2017 0.56    0.18    0.5 0.72    0.33    0.93    3.28    4.80
1-Mar-2017  0.62    0.13    0.42    0.75    0.34    0.94    5.08    4.70
2-Mar-2017  0.59    0.12    0.42    0.76    0.35    0.99    5.12    4.60
3-Mar-2017  0.62    0.13    0.5 0.8 0.32    0.91    5.33    4.50
4-Mar-2017  0.72    0.22    0.52    1.49    0.37    1.08    4.05    4.40
5-Mar-2017  0.68    0.17    0.43    0.74    0.35    1.01    4.76    4.30
6-Mar-2017  0.63    0.18    0.55    0.88    0.38    1.02    4.88    4.20
7-Mar-2017  0.56    0.19    0.41    0.75    0.33    0.91    4.76    4.10

这是我的输出

3/1/2017    CQ  0.62
3/2/2017    CQ  0.59
3/3/2017    CQ  0.62
3/3/2017    Rating  4.50
3/4/2017    CQ  0.72
3/4/2017    LR  0.22
3/4/2017    UD  0.52
3/4/2017    DP  1.49
3/4/2017    DSI 0.37
3/4/2017    UB  1.08
3/4/2017    Rating  4.40
3/5/2017    CQ  0.68
3/5/2017    LR  0.17
3/5/2017    Rating  4.30
3/6/2017    CQ  0.63
3/6/2017    LR  0.18
3/6/2017    UD  0.55
3/6/2017    DP  0.88
3/6/2017    DSI 0.38
3/6/2017    UB  1.02
3/6/2017    DDD 4.88
3/6/2017    Rating  4.20
3/7/2017    Rating  4.10