从以前的帖子(Autocopy cell value from one cell to another sheet by clicking an icon in google sheets)开始,我遇到了一个新问题,希望有人帮我解决。
我正在尝试创建一个电子表格,其中匿名用户可以单击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=
答案 0 :(得分:3)
从上述情况来看,为了实现您的目标,我想提出以下两种模式。
在此模式下,使用分配了功能的图像。在这种情况下,作为示例,它假设将5张图像放置到Ark1
的页面上,并且每个图像的功能名称都类似于copyPasteValue2
,copyPasteValue3
等。>
示例脚本如下。请复制以下脚本并将其粘贴到脚本编辑器中。
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云端硬盘上设置图片的文件ID。然后,请设置sheetName
和max
。
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));
}
}
在这种模式下,我想建议使用复选框而不是图像。在这种情况下,使用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”列具有复选框。如果我误解了您的问题,而这不是您想要的方向,我深表歉意。