首页 > 解决方案 > 根据单元格中的值将行的一部分从一个谷歌电子表格复制到另一个谷歌电子表格?

问题描述

我正在尝试编写一个脚本来根据第 11 列(K)是否有“Y”来复制特定行的 B:K 列。

我有脚本可以在同一个电子表格中从一张工作表移动到另一张工作得很好,但我真的很努力将一个电子表格转移到另一个电子表格,并且只移动行的一部分而不是整个事情。

以下是迄今为止的脚本......希望得到帮助!

function onEdit() {
    var sss = SpreadsheetApp.openById("15RWoaW8tRLVGOTDrZvBLJwx0beWEsV3x8pfwGe2zMfc").getSheetByName("2018 2 Week Snapshot for Jim"); // sss = source spreadsheet
    var r = sss.getActiveRange();

    if(sss.getName() == "2018 2 Week Snapshot for Jim" && r.getColumn() == 11 && r.getValue() == "Y") {
        var row = r.getRow();
        var numColumns = sss.getLastColumn();
        var tss = SpreadsheetApp.openById("1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So"); // tss = target spreadsheet
        var targetSheet = tss.getSheetByName("Test Sheet"); // ts = target sheet
        var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
        tss.getRange(row, 1, 1, numColumns).copyTo(target);
    }

}

这是我的新代码,仍在苦苦挣扎:

function onEdit() {
    var sss = SpreadsheetApp.openById('15RWoaW8tRLVGOTDrZvBLJwx0beWEsV3x8pfwGe2zMfc'); // sss = source spreadsheet
    var ss = sss.getSheetByName('2018 2 Week Snapshot for Jim'); // ss = source sheet
    var SRange = ss.getRange("C:K");

    if(ss.getName() == "2018 2 Week Snapshot for Jim" && SRange.getColumn() == 9 && SRange.getValue() == "y") {
        var row = SRange.getRow();
        var numColumns = ss.getLastColumn();
        var tss = SpreadsheetApp.openById('1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So'); // tss = target spreadsheet
        var ts = tss.getSheetByName('Test Sheet'); // ts = target sheet
        var target = ts.getRange(ts.getLastRow() + 1, 1);
        ss.getRange(row, 1, 1, numColumns).SetValues(target);     
    } 
}

标签: google-apps-scriptgoogle-sheetsgoogle-apigoogle-sheets-api

解决方案


  • 当用户在活动电子表格的工作表上放置yY到列K2018 2 Week Snapshot for Jim,您只想将 的值复制到B:K电子表格上“测试工作表”工作表的最后一行1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So
    • 电子表格15RWoaW8tRLVGOTDrZvBLJwx0beWEsV3x8pfwGe2zMfc是活动的电子表格。

如果我的理解是正确的,那么这个修改呢?

修改点:

  • setofsetValues()是小写。
  • valuesofsetValues(values)是二维数组。
    • range forsetValues(values)是放置值的范围。
  • 使用 时onEdit(),可以使用事件对象。

上面反映的脚本如下。

修改后的脚本:

function myFunction(e) {
  var sourceSheetName = "2018 2 Week Snapshot for Jim";
  var destinationSpreadsheetId = "1dSJOOw_oLVc6Nf-C0MY9715tZGuh69kR6-j_m8EJ-So";
  var destinationSheetName = "Test Sheet";

  if (e.source.getSheetName() == sourceSheetName && e.range.getA1Notation()[0] == "K" && e.value.toUpperCase() == "Y") {
    var sourceValues = e.source.getRange("B:K").getValues().filter(function(e){return e.filter(String).length > 0});
    var tss = SpreadsheetApp.openById(destinationSpreadsheetId);
    var ts = tss.getSheetByName(destinationSheetName);
    ts.getRange(ts.getLastRow() + 1, 1, sourceValues.length, sourceValues[0].length).setValues(sourceValues);
  }
}

笔记 :

  • 在使用此脚本之前,请安装myFunction()为可安装触发器。

参考:

如果我误解了你的情况,我很抱歉。


推荐阅读