有没有办法在谷歌工作表中使用行的第一个单元格作为getsheetbyname参数


function onEdit(event) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();

if(s.getName() == "Sheet1" && r.getColumn() == 3 && r.getValue() == true) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("id1");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
// s.deleteRow(row);
} 
}

这是到目前为止的代码,我想知道是否有一种方法可以让我自动附加所有的行或";id";如果使用行的第一个单元格作为getsheetbyname的参数选中了他们的复选框,则返回到他们的特定选项卡?

我试图创建一个变量并将其放入getSheetByName((中,就像下面的例子一样,但没有成功。我对javascript/apps脚本很陌生。

function onEdit(event) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();

if(s.getName() == "Sheet253" && r.getColumn() == 2 && r.getValue() == true) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var a = row[0];
var targetSheet = ss.getSheetByName(a);
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
// s.deleteRow(row);
} 
}

这是谷歌表单的一个示例:https://docs.google.com/spreadsheets/d/19TzSKyY4616sWpY2ONPj01F5CJDfsTJ7DmbFXPVKvJE/edit?usp=sharing

结果应该与选项卡id1中的结果类似。

修改点:

  • 在您的脚本中,我认为可以使用事件对象
  • 在您的示例电子表格中,似乎将复选框放在了";C";。当您想要运行脚本时,当复选框被选中时,被选中的列就是列";C">

当这些点反映在脚本中时,下面的修改如何?

修改的脚本:

根据您提供的示例电子表格,此脚本假设源工作表名称为";Sheet1";。请小心。

function onEdit(event) {
var ss = event.source;
var s = ss.getActiveSheet();
var r = event.range;
if (s.getName() == "Sheet1" && r.columnStart == 3 && r.isChecked()) {
var sheetName = r.offset(0, -2).getValue();
var targetSheet = ss.getSheetByName(sheetName);
if (!targetSheet) {
Browser.msgBox(`"${sheetName}" was not found.`);
return;
}
var row = r.rowStart;
var numColumns = s.getLastColumn();
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
// s.deleteRow(row);
}
}
  • 在这个脚本中,当列的复选框"C";的";Sheet1";如果选中,则复制该行

注意:

  • 在显示脚本中,将使用编辑后的行。所以我修改了你的剧本,按照你的表演剧本。但是,关于This is the code so far and I was wondering if there was a way for me to automatically append all of the row or "id" to their specific tab if their checkbox has been checked using the 1st cell of the row as the parameter for the getsheetbyname?,如果您想通过一次脚本执行来复制所有行,那么下面的示例脚本如何?当运行此脚本时;C";的";Sheet1";并且使用列"0"的值将每个值复制到每张纸上;A";。

    function sample() {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const srcSheet = ss.getSheetByName("Sheet1");
    const obj = srcSheet.getRange("A2:C" + srcSheet.getLastRow()).getValues().reduce((o, r) => {
    if (r[2] === true) {
    o[r[0]] = o[r[0]] ? [...o[r[0]], r] : [r];
    }
    return o;
    }, {});
    Object.entries(obj).forEach(([name, values]) => {
    const sheet = ss.getSheetByName(name);
    const range = sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length);
    range.setValues(values).offset(0, 2, values.length, 1).insertCheckboxes();
    });
    }
    

注意:

  • 此示例脚本适用于您提供的示例电子表格。因此,当您更改电子表格的结构时,脚本可能无法使用。所以,请小心

参考文献:

  • 事件对象
  • 获取值((
  • setValues(值(

相关内容

最新更新