首页 > 解决方案 > 将特定数据从工作表复制到工作表

问题描述

https://docs.google.com/spreadsheets/d/1mpALs4rdNj-TFFgCQ0CEBP453v-FfQJR_bBxOzQakWU/edit#gid=1256640730

我有一个“主列表”表从Google 表单收集数据,我需要脚本根据他们的“位置”将数据从主列表复制到相关表。

Example 1

表 1:包含所有数据(主列表)
名称......地址......地点
Rose.......21,Radje Road,88888....Kedah
Rose.......21,Radje Road,88888....Kedah
Rose .......21,Radje Road,88888............Penang
Stone......5,Jae Road,22222....... .槟城

表 2:从表 1 复制数据(仅限位置 - 吉打)
名称......地址...................... ...地点
Rose.......21,Radje Road,88888..........Kedah
Rose.......21,Radje Road,88888........ .吉打

表 3:从表 1 复制数据(仅限位置 - 槟城)
名称......地址...................... ...地点
Rose.......21,Radje Road,88888............Penang
Stone......5,Jae Road,22222............槟城

Example 2

表 1:包含所有数据(主列表)
姓名......性别
Bryan ......男
Mei ......女
Lily ......女
xx ......女
xx... ..男性

工作表 2:从工作表 1 复制数据(仅限性别 - 女性)
姓名.....性别
xx .....女
Lily .....女
Mei .....女

工作表 3:从工作表 1 复制数据(仅限性别-男性)
姓名.....性别
Bryan .....男性

  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Master List');
  const shsr=2;//data start row on master list
  const shhr=1;//master list header row
  const hA=sh.getRange(shhr,1,1,sh.getLastColumn()).getValues()[0];
  const vs=sh.getRange(shsr,1,sh.getLastRow()-shsr+1,sh.getLastColumn()).getValues();
  const base='Sheet';
  let shts=ss.getSheets();
  shts.forEach(function(s,i){if(s.getName()!='Master List'){ss.deleteSheet(s);}});//delete all other sheets
  const gvs=sh.getRange(shsr,7,sh.getLastRow()-shsr+1,1).getValues().map(function(r){return r[0]});
  const s=new Set(gvs);
  const g=[...s];//g has unique values now
  g.forEach(function(v,i){
    let nsh=ss.insertSheet(base + String(i+1),i+1);
    let aA=[]
    aA.push(hA);//start with header row
    vs.forEach(function(r,j){
      //compare to column G value
      if(r[6]==v) {
        aA.push(r);//add rows that match
      }
    });
    nsh.getRange(1,1,aA.length,aA[0].length).setValues(aA);
    SpreadsheetApp.flush();//not really necessary but fun to watch the progress
  });
}

标签: google-apps-scriptcopyclassificationtext-classificationdata-transfer

解决方案


尝试这个:

function copyDataUniqueToColG() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Master List');
  const shsr=2;//data start row on master list
  const shhr=1;//master list header row
  const hA=sh.getRange(shhr,1,1,sh.getLastColumn()).getValues().map(function(r){return[r[1],r[2],r[3],r[4],r[5],r[6]]})[0];
  const vs=sh.getRange(shsr,1,sh.getLastRow()-shsr+1,sh.getLastColumn()).getValues();
  const base='Sheet';
  let shts=ss.getSheets();
  //shts.forEach(function(s,i){if(s.getName()!='Master List'){ss.deleteSheet(s);}});//delete all other sheets
  const gvs=sh.getRange(shsr,7,sh.getLastRow()-shsr+1,1).getValues().map(function(r){return r[0]});
  const s=new Set(gvs);
  const g=[...s];//g has unique values now
  g.forEach(function(v,i){
    let sA=[];
    ss.getSheets().forEach(function(obj){sA.push(obj.getName())});
    if(sA.indexOf(v)==-1){ss.insertSheet(v);}
    let aA=[]
    aA.push(hA);//start with header row
    vs.forEach(function(r,j){
      //compare to column G value
      if(r[6]==v) {
        aA.push([r[1],r[2],r[3],r[4],r[5],r[6]]);//add rows that match
      }
    });
    let dsh=ss.getSheetByName(v);
    dsh.getRange(1,1,aA.length,aA[0].length).setValues(aA);
    SpreadsheetApp.flush();//not really necessary but fun to watch the progress
  });
}

推荐阅读