首页 > 解决方案 > 为 google sheet 项目的 java 脚本代码的变量索引当前列

问题描述

我刚刚开始学习 javascript,我正在尝试做这样的事情:

我有 2 张不同的工作表,Sheet1 有一些数据,而 Sheet2 是空的。Sheet1 在 A 列中有数字,在其他列中有一些东西。

我试图制作一个脚本,当我在 Sheet2 的 A 列上输入一个整数(该数字在该工作表中必须是唯一的并且出现在 Sheet1 的 A 列上)并且它等于 Sheet1 的 A 列的数量时运行该脚本必须将 Sheet1 的相应行复制到 Sheet2。

我所做的是这样的:

function votazioni() {
  var spreadsheet = SpreadsheetApp.getActive();
  var activeSheet= spreadsheet.getActiveSheet();
  var baseDati= spreadsheet.getSheetByName("Foglio2");
  var cellRange = activeSheet.getActiveCell();
  var imput= activeSheet.getActiveCell().getValue();
  var indiceImput= cellRange.getColumn();
  var copiaDati=baseDati.getActiveRange(1,indiceImput).getValue();
        for (var i=1; i<1204; i++){
          if (imput == copiaDati) {
            for( var j=2; j<7; j++){
              var copiaValore=baseDati.getRange (j,indiceImput).getValue();
              activeSheet.getRange(j,indiceImput).setValue(copiaValore);
            }
            i=1204;          
          }    
        }
}

例如,如果我在 Sheet2 的 A2 上键入 45,则 B2 应该是 Paperino,C2 应该是 3,D2 应该是 agafdh

抱歉英语不好,提前谢谢你。

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 45放入“Sheet2”的单元格“A2”时,您想45从“Sheet1”的“A”列中搜索 的值,并将搜索到的行复制到“Sheet2”。
  • 您想使用 Google Apps 脚本来实现这一点。

修改点:

  • 在您的脚本中,imputcopiaDati进行了比较。但似乎没有扫描“Sheet1”的“A”列。
  • 在这种情况下,我认为 OnEdit 触发器可能适合实现您的目标。使用 OnEdit 触发器时,当编辑“Sheet2”的“A”列时,可以自动运行脚本。我认为这种情况可能对您的情况有用。

以上几点反映到一个脚本,它变成如下。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。并且,请编辑“Sheet2”的“A”栏。这样,脚本运行,从“Sheet1”的“A”列中搜索看跌值并将该行复制到“Sheet2”。

function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
  const value = range.getValue();
  const srcSheet = e.source.getSheetByName("Sheet1");
  const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
  if (srcRange) {
    srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
  }
}
  • 在此示例脚本中,根据您的问题,使用了“Sheet1”和“Sheet2”的工作表名称。因此,如果您的实际情况与它们不同,请修改它们。

  • 该脚本的流程如下。

    1. 检查“Sheet2”的“A”列是否被编辑。
    2. 编辑“Sheet2”的“A”列时,检索编辑后的值。
    3. 从“Sheet1”的“A”列中搜索编辑值。在这种情况下,使用 TextFinder。
    4. 将行从“Sheet1”复制到“Sheet2”。

笔记:

  • 在这个脚本中,为了达到你的目的,使用了简单触发器的 OnEdit 触发器。所以当你直接运行onEdit脚本编辑器的函数时,会出现错误。请注意这一点。运行脚本时,请编辑“Sheet2”的“A”列。

  • 当您想手动将脚本运行到活动单元格时,您还可以使用以下脚本。在这种情况下,您可以在脚本编辑器中运行脚本。

      function myFunction() {
        const ss = SpreadsheetApp.getActiveSpreadsheet();
        const sheet = ss.getActiveSheet();
        const range = sheet.getActiveCell();
        if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
        const value = range.getValue();
        const srcSheet = ss.getSheetByName("Sheet1");
        const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
        if (srcRange) {
          srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
        }
      }
    

参考:

添加:

关于您的附加问题如下。

是否可以避免在 Sheet2 的 A 列上出现双值?

示例脚本如下。

示例脚本:

在这种情况下,onEdit被修改。当您使用这个脚本时,请在“Sheet2”的“A”列中输入一个值。在这种情况下,当“Sheet2”的“A”列中存在看跌值时,将删除看跌值。另一方面,当“Sheet2”的“A”列中不存在看跌值时,从“Sheet1”的“A”列中搜索看跌值并复制该行。

function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
  const value = range.getValue();
  const values = sheet.getRange("A2:A" + sheet.getLastRow()).getValues();
  values.splice(range.getRow() - 2, 1);
  if (values.flat().includes(value)) {
    range.clearContent();
    return;
  }
  const srcSheet = e.source.getSheetByName("Sheet1");
  const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
  if (srcRange) {
    srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
  }
}
  • 当值存在时,如果您不想删除“Sheet2”上的看跌值,请删除range.clearContent();.

推荐阅读