首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用复选框将粘贴转到目标范围使用Google

使用复选框将粘贴转到目标范围使用Google
EN

Stack Overflow用户
提问于 2022-10-11 23:23:55
回答 2查看 38关注 0票数 1

插入的脚本复制范围Sheet1!A5:F5中的值,然后转置粘贴到Sheet2的第一行和第二列中。

脚本能够在连续使用时复制并转到第二列最后一行下的粘贴,直到重置为止。

粘贴前的当前结果-复制范围Sheet1 A5:F5

粘贴到Sheet2中第二列后的电流结果

我的目标是:

  1. 以便脚本使用单元格B2中的复选框。
  2. 若要为要粘贴到的值创建目标范围: Sheet2!B7:B -希望仍然允许转置粘贴通过getLastRow()+1发挥作用。

粘贴前的预期结果-复选框= True,复制范围Sheet1 A5:F5

粘贴后的预期效果Sheet2 B7:B

已尝试插入:

if (sheet.getSheetName() != "*DuplioMltSlds" || range.getA1Notation() != "D13" || !range.isChecked()) return;

以及将函数更改为onEdit。也曾尝试过各种var row = ss.getRange("Sheet2!B7:B")选项,但一直未能找到合适的结果。

样本表

脚本源和脚本:

代码语言:javascript
复制
function copyTransposeAndDelete () {

  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var source = ss.getRange("Sheet1!A5:F5");
  var destSheet = ss.getSheetByName("Sheet2");
  var destRange = destSheet.getRange(destSheet.getLastRow()+1, 2, source.getWidth(), source.getHeight());
  destRange.setValues(transpose(source.getValues()));
}

function transpose(array) {
  return array[0].map(function(row, i) { 
    return array.map(function(col) { 
      return col[i]; 
    });
  });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-11 23:38:45

我相信你的目标如下。

  • 您希望将"Sheet1“的单元格"A5:F5”复制并粘贴到"Sheet2“的单元格"B2”中。在这种情况下,您希望通过转置来复制值。
  • 当这些值再次被复制时,您希望将转置值粘贴到"Sheet2“的"B”列的(最后一行+ 1)。
  • 要在选中"B2“的单元格"Sheet1”的复选框时运行脚本。

在这种情况下,下面的修改如何?

修改脚本:

代码语言:javascript
复制
function onEdit(e) {
  // Ref: https://stackoverflow.com/a/44563639
  Object.prototype.get1stNonEmptyRowFromBottom = function (columnNumber, offsetRow = 1) {
    const search = this.getRange(offsetRow, columnNumber, this.getMaxRows()).createTextFinder(".").useRegularExpression(true).findPrevious();
    return search ? search.getRow() : offsetRow;
  };

  var { source, range } = e;
  var sheet = range.getSheet();
  if (sheet.getSheetName() != "Sheet1" || range.getA1Notation() != "B2" || !range.isChecked()) return;
  var srcRange = sheet.getRange("A5:F5");
  var dstSheet = source.getSheetByName("Sheet2")
  var row = dstSheet.get1stNonEmptyRowFromBottom(2) + 1;
  var dstRange = dstSheet.getRange("B" + (row < 7 ? 7 : row));
  srcRange.copyTo(dstRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, true);
}
  • 在您的情况下,我认为copyTo(目的地,copyPasteType,转置)可能是合适的。因为,在此方法中,可以通过转置来复制值。
  • 使用OnEdit触发器时,可以使用事件对象。这样,加工成本就会降低一点。参考

注意:

  • 使用此脚本时,请选中"B2“的"Sheet1”复选框。这样,脚本就可以运行了。当您直接使用脚本编辑器运行脚本时,会出现类似于TypeError: Cannot destructure property 'source' of 'e' as it is undefined.的错误。请小心这件事。

参考文献:

添加:

如果您想将值放到"Sheet2“的列"B”中,即使"Sheet2“的列"B”已经在第7行之后有值,那么下面的示例脚本如何?

示例脚本:

代码语言:javascript
复制
function onEdit(e) {
  // Ref: https://stackoverflow.com/a/44563639/7108653
  Object.prototype.get1stEmptyRowFromTop = function (columnNumber, offsetRow = 7) {
    const range = this.getRange(offsetRow, columnNumber, 2);
    const values = range.getDisplayValues();
    if (values[0][0] && values[1][0]) {
      return range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1;
    } else if (values[0][0] && !values[1][0]) {
      return offsetRow + 1;
    }
    return offsetRow;
  };

  var { source, range } = e;
  var sheet = range.getSheet();
  if (sheet.getSheetName() != "Sheet1" || range.getA1Notation() != "B2" || !range.isChecked()) return;
  var srcRange = sheet.getRange("A5:F5");
  var dstSheet = source.getSheetByName("Sheet2")
  var row = dstSheet.get1stEmptyRowFromTop(2);
  var dstRange = dstSheet.getRange("B" + row);
  srcRange.copyTo(dstRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, true);
}
票数 2
EN

Stack Overflow用户

发布于 2022-10-12 00:16:42

代码语言:javascript
复制
function myfunk() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet1")
  const vs  = sh.getRange("A4:F4").getValues().flat().map(e => [e]);
  const dsh = ss.getSheetByName("Sheet2");
  dsh.getRange(7,2,vs.length,vs[0].length).setValues(vs)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74034981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档