使用一个脚本,使用行中的图标将文本从一行中的单元格复制到另一张工作表



在我之前的文章中(通过单击谷歌工作表中的图标将单元格值从一个单元格自动复制到另一个工作表(,我现在遇到了一个新问题,我希望有人能帮我解决这个问题。

我正在尝试实现一个电子表格,匿名用户可以单击a列中的图标,然后将B列和C列中的数据从表1移动到表2,其中包括时间戳。

到目前为止还不错。它是在这个伟大社区的帮助下建立和运行的。我正在使用这个脚本:

function copyPasteValue2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Ark1');
var r = s.getRange('b2');
var v = r.getValue();
var a = s.getRange('c2');
var d = a.getValue();
var s2 = ss.getSheetByName('Ark2');
var timeZone = ss.getSpreadsheetTimeZone();
var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
s2.getRange('A2:C2').setValues([[t,v,d]]);
}

现在,我正在研究将此工作表放大,并包含100多个条目,所有这些条目都具有此功能——单击A列中的图标,将C和B中的数据移动到工作表2。

我的问题是,如果不创建另外100个脚本,我如何实现这一点?由于我在这里进展缓慢,到目前为止,我的搜索还没有找到解决方案。

我已经制作了一份测试表,以获得任何帮助:https://docs.google.com/spreadsheets/d/1z5TGWp3N002z0GNts4NRyspkjXcsN52rxPtx8Pu9D70/edit#gid=

  • 您希望通过单击电子表格上的图像来运行脚本
  • 您希望将图像放在列"A"中。在这种情况下,您需要放置大量的图像
  • 您希望使用简单的脚本来实现这一点

问题和解决方法:

  • 不幸的是,在当前阶段,当通过单击工作表上的图像来运行脚本时,脚本无法知道图像是在哪里单击的。不幸的是,在您的情况下,当您想通过单击图像来运行脚本时,需要为每个图像分配不同的函数名
  • 此外,当通过单击图像运行脚本时,似乎在运行全局变量之前搜索了函数。这样,就无法实现使用脚本自动安装功能

根据上述情况,为了实现您的目标,我想提出以下两种模式。

模式1:

在该模式中,使用分配给功能的图像。在这种情况下,作为样本,假设5个图像被放置到Ark1的片材上,并且每个图像具有类似copyPasteValue2copyPasteValue3等的函数名称

示例脚本:

示例脚本如下。请将以下脚本复制并粘贴到脚本编辑器中。

function main(row) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Ark1');
var [v, d] = s.getRange(`B${row}:C${row}`).getValues()[0];
var s2 = ss.getSheetByName('Ark2');
var timeZone = ss.getSpreadsheetTimeZone();
var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
s2.getRange(`A${row}:C${row}`).setValues([[t,v,d]]);
}
const copyPasteValue2 = () => main(2);
const copyPasteValue3 = () => main(3);
const copyPasteValue4 = () => main(4);
const copyPasteValue5 = () => main(5);
const copyPasteValue6 = () => main(6);
  • 在该脚本中,当具有copyPasteValue2的函数名称的图像被点击时,作为图像的行的2被赋予main()的函数。由此,copyPasteValue2可以作为行2来运行

注意:

  • 关于const copyPasteValue2 = () => main(2); const copyPasteValue3 = () => main(3); ,,,,格式是常量。例如,我认为您也可以将这些脚本创建为文本文件,然后将它们复制并粘贴到脚本编辑器中
  • 如果要使用脚本将图像插入列"A",可以使用以下函数。当您使用此功能时,请在Google Drive上设置图像的文件ID。请设置sheetNamemax

    function insertImages() {
    var id = "###";  // Please set the file ID of the image.
    var sheetName = "Sheet1"; // Please set the sheet name.
    var max = 5;  // Please set the number of images you want to put.
    var blob = DriveApp.getFileById(id).getBlob();
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName(sheetName);
    sheet.setRowHeights(2, max, 64).setColumnWidth(1, 64);
    for (var i = 0; i < max; i++) {
    sheet.insertImage(blob, 1, i + 2).setHeight(64).setWidth(64).assignScript("copyPasteValue" + (i + 2));
    }
    }
    

模式2:

在这种模式中,我建议使用复选框而不是图像。在这种情况下,使用OnEdit事件触发器,当复选框被单击时,它可以知道被单击的复选框的坐标。通过这种方式,脚本可以变得比模式1的脚本更简单。

示例脚本:

function main(row) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Ark1');
var [v, d] = s.getRange(`B${row}:C${row}`).getValues()[0];
var s2 = ss.getSheetByName('Ark2');
var timeZone = ss.getSpreadsheetTimeZone();
var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
s2.getRange(`A${row}:C${row}`).setValues([[t,v,d]]);
}
function onEdit(e) {
const range = e.range;
if (range.getSheet().getSheetName() == "Ark1" && e.value == "TRUE") {
main(range.rowStart);
range.uncheck();
}
}
  • 在上面的脚本中,它假设Ark1表上的列"A"具有复选框
  • 在这种情况下,您可以使用简单的触发器来运行脚本

注意:

  • 在这种情况下,请在脚本编辑器中启用V8

参考文献:

  • 类OverGridImage
  • 简单触发器

如果我误解了你的问题,而这不是你想要的方向,我道歉。

最新更新