Google apps script 基于Google工作表中的下拉值移动(复制)单元格值

Google apps script 基于Google工作表中的下拉值移动(复制)单元格值,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试使用GoogleSheets创建一个基本的CRM,它将所有客户的数据保存在一张表中,并在另一张表中显示他们处于交易阶段的哪一部分。下面是我的意思的一个例子 第1页: Name | Email | Deal Stage | Ian ian@.. >>Pre-launch << dropdown list Ken ken@.. >>Pre-launch << dropdown list Dan dan@.

我正在尝试使用GoogleSheets创建一个基本的CRM,它将所有客户的数据保存在一张表中,并在另一张表中显示他们处于交易阶段的哪一部分。下面是我的意思的一个例子

第1页:

Name |  Email  |  Deal Stage |
Ian     ian@..  >>Pre-launch << dropdown list 
Ken     ken@..  >>Pre-launch << dropdown list 
Dan     dan@..  >>Out-Reach  << dropdown list
Ben     ben@..  >>Call Booked<< dropdown list
我希望创建一个脚本,它可以在下拉单元格中激发任何项的
onEdit
。这可能吗?最干净的方法是什么

我已经创建了这个功能,它只包含有问题的功能

再试一次

function dealStage(e)
{
  //var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ss = e.source;
  var sht = ss.getSheetByName('ClientData');
  var rng = sht.getDataRange();
  var rngA = rng.getValues();
  var clientheaders = rngA[0];
  var dsSht = ss.getSheetByName('DealStage');
  var dsShtRng = dsSht.getRange(2, 1, dsSht.getLastRow(), dsSht.getLastColumn());
  dsShtRng.clearContent();
  var dsShtHdrsRng = dsSht.getRange(1, 1, 1, dsSht.getLastColumn());
  var dsShtHdrsRngA = dsShtHdrsRng.getValues();
  var dsheaders = dsShtHdrsRngA[0];
  var prelaunch = [];
  var outreach = [];
  var brochuresent = [];
  var callbooked = [];
  var dsi = clientheaders.indexOf('Deal Stage');
  var ni = clientheaders.indexOf('Name');
  for(var i=1;i<rngA.length;i++)
  {

    var dsv = rngA[i][dsi];
    var nv = rngA[i][ni]
    if(dsv!='')
    {
        switch(dsv)
        {
          case('Pre-Launch'):
            prelaunch.push([nv]);
            break;
          case('Out-Reach'):
            outreach.push([nv]);
            break;
          case('Brochure-Sent'):
            brochuresent.push([nv]);
            break;
          case('Call-Booked'):
            callbooked.push([nv]);
            break;
        }
    }
  }
  var dsstartrow = dsSht.getLastRow()+1;
  for(var i=0;i<dsheaders.length;i++)
  {
    var hdr = dsheaders[i];
    switch(hdr)
    {
      case('Pre-Launch'):
        if(prelaunch.length>0)dsSht.getRange(dsstartrow,i+1,prelaunch.length,1).setValues(prelaunch);
        break;
      case('Out-Reach'):
        if(outreach.length>0)dsSht.getRange(dsstartrow,i+1,outreach.length,1).setValues(outreach);
        break;
      case('Brochure-Sent'):
        if(brochuresent.length>0)dsSht.getRange(dsstartrow,i+1,brochuresent.length,1).setValues(brochuresent);
        break;
      case('Call-Booked'):
        if(callbooked.length>0)dsSht.getRange(dsstartrow,i+1,callbooked.length,1).setValues(callbooked);
        break;
    }
  }
  SpreadsheetApp.flush();
}
功能解除阶段(e)
{
//var ss=SpreadsheetApp.getActiveSpreadsheet();
var ss=e.来源;
var sht=ss.getSheetByName('ClientData');
var rng=sht.getDataRange();
var rngA=rng.getValues();
var clientheaders=rngA[0];
var dsSht=ss.getSheetByName('DealStage');
var dsShtRng=dsSht.getRange(2,1,dsSht.getLastRow(),dsSht.getLastColumn());
dsShtRng.clearContent();
var dsshththdhrsrng=dsSht.getRange(1,1,1,dsSht.getLastColumn());
var dsshththdrsrnga=dsshthththdrsrng.getValues();
var dsheaders=dsshththdrsrnga[0];
var预启动=[];
var=[];
var手册当前=[];
var callbook=[];
var dsi=clientheaders.indexOf(“交易阶段”);
var ni=clientheaders.indexOf('Name');
对于(var i=1;i0)dsSht.getRange(dsstartrow,i+1,outapping.length,1)。设置值(outapping);
打破
案例(“宣传册已发送”):
如果(画册呈现长度>0)dsSht.getRange(dsstartrow,i+1,画册呈现长度,1).SetValue(画册呈现);
打破
案例(“电话预约”):
如果(callbooked.length>0)dsSht.getRange(dsstartrow,i+1,callbooked.length,1).setValues(callbooked);
打破
}
}
SpreadsheetApp.flush();
}
客户资料表:

阶段表:

验证表:


谢谢你的建议@Cooper。但是,只有将
交易阶段设置为单独的工作表时,此解决方案才有效。在这种情况下,这是行不通的。我需要将所有数据保存在表1中,并使用表2表示一个人的姓名所处的
交易阶段。
function dealStage(e)
{
  //var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ss = e.source;
  var sht = ss.getSheetByName('ClientData');
  var rng = sht.getDataRange();
  var rngA = rng.getValues();
  var clientheaders = rngA[0];
  var dsSht = ss.getSheetByName('DealStage');
  var dsShtRng = dsSht.getRange(2, 1, dsSht.getLastRow(), dsSht.getLastColumn());
  dsShtRng.clearContent();
  var dsShtHdrsRng = dsSht.getRange(1, 1, 1, dsSht.getLastColumn());
  var dsShtHdrsRngA = dsShtHdrsRng.getValues();
  var dsheaders = dsShtHdrsRngA[0];
  var prelaunch = [];
  var outreach = [];
  var brochuresent = [];
  var callbooked = [];
  var dsi = clientheaders.indexOf('Deal Stage');
  var ni = clientheaders.indexOf('Name');
  for(var i=1;i<rngA.length;i++)
  {

    var dsv = rngA[i][dsi];
    var nv = rngA[i][ni]
    if(dsv!='')
    {
        switch(dsv)
        {
          case('Pre-Launch'):
            prelaunch.push([nv]);
            break;
          case('Out-Reach'):
            outreach.push([nv]);
            break;
          case('Brochure-Sent'):
            brochuresent.push([nv]);
            break;
          case('Call-Booked'):
            callbooked.push([nv]);
            break;
        }
    }
  }
  var dsstartrow = dsSht.getLastRow()+1;
  for(var i=0;i<dsheaders.length;i++)
  {
    var hdr = dsheaders[i];
    switch(hdr)
    {
      case('Pre-Launch'):
        if(prelaunch.length>0)dsSht.getRange(dsstartrow,i+1,prelaunch.length,1).setValues(prelaunch);
        break;
      case('Out-Reach'):
        if(outreach.length>0)dsSht.getRange(dsstartrow,i+1,outreach.length,1).setValues(outreach);
        break;
      case('Brochure-Sent'):
        if(brochuresent.length>0)dsSht.getRange(dsstartrow,i+1,brochuresent.length,1).setValues(brochuresent);
        break;
      case('Call-Booked'):
        if(callbooked.length>0)dsSht.getRange(dsstartrow,i+1,callbooked.length,1).setValues(callbooked);
        break;
    }
  }
  SpreadsheetApp.flush();
}