首页 > 解决方案 > 是否有脚本可以根据 2 张纸上的匹配单元格值来选择在哪一行运行宏?

问题描述

我需要帮助让我的宏根据该工作表第一列中的值将数据传输到另一个工作表中的特定行。

我在 Google 工作簿中设置了两个不同的工作表。一张表非常大且复杂,因此很难将信息输入(表 2)。我已经设置了第二张表,只显示需要输入的信息,因此很容易完成(表 1)。我已经录制了一个宏,只需单击一个按钮即可将数据从条目表移动到结束表(基本上只是复制/粘贴)。

我需要帮助的是让它将数据复制到该表中的正确行。

快速输入表(表 1)有一个地方可以输入添加信息的日期。然后,该日期将对应于较大文件(表 2)中的日期。这是数据需要移动到的行(通过宏完成)。是否有脚本将工作表 1 中的日期与工作表 2 中与该日期对应的行匹配,以告诉宏要在哪一行运行数据复制/粘贴?

表 1: 表 1

表 2: 表 2

如果您有任何问题或者我需要以不同的方式发送照片,请告诉我。

非常感谢您的帮助!

标签: google-apps-script

解决方案


从任何范围复制到同一电子表格中的任何其他范围

这是一个自定义对话框,用于选择范围和范围并执行范围到范围的复制。

有很多方法可以做到这一点。我有一个简单的模板化 html,我用它来相当快地处理这些事情。这花了我在后台听的 ButterFly Effect 2 的长度。但我打字没有以前那么快了。

我从做一个宏开始,这是宏脚本:

function CopyRangeFromSheetToSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getCurrentCell().offset(-2, 0, 1, 7).activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('InvData'), true);
  spreadsheet.getCurrentCell().offset(3, 5).activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('form response'), true);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('InvData'), true);
  spreadsheet.getCurrentCell().offset(-2, -5, 1, 7).activate();
  spreadsheet.getRange('\'form response\'!A9:G9').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}

但我相信你想指定 from 和 to 范围,所以我决定使用自定义无模式对话框,允许通过选择工作表和范围并按下 from 和两者的按钮来选择 from 和 to 范围,当你同时拥有两者时捕获的范围您按下复制按钮,然后它会复制并删除对话框。它需要一些文件,它们都在下面:

示例1.html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <?!= include('res1') ?>
    <?!= include('css1') ?>
  </head>
  <body>
   <div id="control">
     <br />FROM: <input type="text" id="fromTxt" placeholder="Select From Range" /><input type="button" value="Select From" onClick="selectFrom();" />
     <br />TO: <input type="text" id="toTxt" placeholder="Select To Range" /><input type="button" value="Select To" onClick="selectTo();" />
     <br /><input type="button" value="Copy" onClick="runCopy();" />
   </div>

   <?!= include('script1') ?>
  </body>
</html>

res1.html:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

脚本1.html:

<script>
  $(function(){

  });
  function selectFrom() {
    google.script.run
    .withSuccessHandler(function(rgstr){
      $('#fromTxt').val(rgstr);
    })
    .selectFrom();
  }
  function selectTo() {
    google.script.run
    .withSuccessHandler(function(rgstr){
      $('#toTxt').val(rgstr);
    })
    .selectTo();
  }
  function runCopy() {
    var from=$('#fromTxt').val();
    var to=$('#toTxt').val();
    var cObj={from:from,to:to};
    google.script.run
    .withSuccessHandler(function(s){
      google.script.host.close();
    })
    .performCopy(cObj);
  }
  console.log('My Code');
</script>

css1.html:

<style>
body {background-color:#ffffff;}
input{padding:2px;margin:2px;}
</style>

示例1.gs

function selectFrom() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  var rgstr=Utilities.formatString('\'%s\'!%s',sh.getName(),rg.getA1Notation());
  return rgstr;
}

function selectTo() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  var rgstr=Utilities.formatString('\'%s\'!%s',sh.getName(),rg.getA1Notation());
  return rgstr;
}

function performCopy(cObj) {
  var ss=SpreadsheetApp.getActive();
  var frg=ss.getRange(cObj.from);
  var trg=ss.getRange(cObj.to);
  frg.copyTo(trg);
  return 'done';
}
function showExample1Dialog(){
  var userInterface=HtmlService.createTemplateFromFile('example1').evaluate();
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Example1");
}

function include(filename){
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

推荐阅读