google-apps-script - 将值从活动工作表复制到另一个工作表
问题描述
我想将当前工作表的不同值(我在启动脚本时看到的工作表)复制到另一张工作表。
function printIng() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var actualSheetName = ss.getActiveSheet().getName();
var actualSheetName1 = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
var selection = SpreadsheetApp.getSelection();
var currentCell = selection.getCurrentCell();
//Logger.log('Nome foglio'+nameRicetta);
//var value = ss.getActiveSheet().getSheetName();
//Logger.log('nome ricetta:'+ value);
//var lastRow = getLastRowSpecial(dataRange);
//TEST
if(actualSheetName != "Indice Ricette" &&
actualSheetName != "Template" &&
actualSheetName != "Ingrediente" &&
actualSheetName != "Impostazioni" &&
actualSheetName != "Tipologia"){
var nameRicetta = ss.getActiveSheet().getRange('C4').getValue();
//inserire if per decidere se creare ingrediente o no
var ui = SpreadsheetApp.getUi();
var result = ui.alert(
'Please confirm',
'Are you sure you want create'+ '['+ nameRicetta +'] ingredient?',
ui.ButtonSet.YES_NO);
// Process the user's response.
if (response == ui.Button.YES) {
Logger.log('The user clicked "Yes."');
var sheet = ss.setActiveSheet(ss.getSheetByName("Ingredienti"));
var dataRange = sheet.getDataRange();
//Select the column we will check for the first blank cell
var columnToCheck = sheet.getRange("A:A").getValues();
// Get the last row based on the data range of a single column.
var lastRow = getLastRowSpecial(columnToCheck)+1;
sheet.getRange(lastRow,1,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome
sheet.getRange(lastRow,2,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome
sheet.getRange(lastRow,3,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome
sheet.getRange(lastRow,4,1,1).setFormula('='+ nameRicetta +'!Y2');//zucc
sheet.getRange(lastRow,5,1,1).setFormula('='+ nameRicetta +'!Y5');//gras
sheet.getRange(lastRow,6,1,1).setFormula('='+ nameRicetta +'!Y8');//sml
sheet.getRange(lastRow,7,1,1).setFormula('='+ nameRicetta +'!Y11');//as
sheet.getRange(lastRow,8,1,1).setValue('0');
sheet.getRange(lastRow,9,1,1).setValue('0');
sheet.getRange(lastRow,10,1,1).setFormula('='+ nameRicetta +'!S25');//pod rel
sheet.getRange(lastRow,11,1,1).setFormula('='+ nameRicetta +'!Q25');//pac rel
} else {
Logger.log('The user clicked "No" or the close button in the dialog\'s title bar.');
}
}
}
但是变量actualSheetName总是返回第一张纸(在这种情况下是“Indice Ricette”)
如何检索真正的当前工作表?
解决方案
让我们尝试一个更简单的例子:
function onEdit(e) {
e.source.toast(e.range.getSheet().getName());
}
function abc() {
/do nothing
}
将上述函数复制到您的脚本编辑器并保存。然后运行 abc(),如果您需要授权任何脚本,则会弹出一个对话框,让您可以这样做。
然后创建几个你不介意弄乱的页面。并在其中一个中编辑一个单元格。一个称为 toast 的小对话框将出现在屏幕的右下角,告诉您活动页面的名称是什么。它始终是您编辑的页面。您需要实际编辑页面上的某些内容才能触发 onEdit(e) 函数。
在一个电子表格中的工作表之间复制
这是我几年前做的一个例子,我相信我花了大约 4 个小时,而我只用了大约 30 分钟。这是一个带有自定义对话框的完整示例,使您能够选择工作表、源范围和目标范围以及从源复制到目标。玩得开心。
ah3.html:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<style>
input{margin:5px 2px 5px 0};
</style>
</head>
<body>
<br /><select id="sel1" onchange="gotoSheet();"></select>
<br /><input type="text" id="from" placeholder="Select Source Range" />
<br /><input type="button" value="Save Source Range" onClick="saveFrom();"/>
<br /><input type="text" id="to" placeholder="Selection Destination Range" />
<br /><input type="button" value="Save Destination Range" onClick="saveTo(); "/>
<br /><input type="button" value="Copy" onClick="doit()";/>
<script>
var gfrom={};
var gto={};
$(function(){
google.script.run
.withSuccessHandler(function(vA){
updateSelect(vA);
})
.getSelections()
});
function updateSelect(vA,id){
var id=id || 'sel1';
vA.unshift('Please Select Sheet')
var select = document.getElementById(id);
select.options.length = 0;
for(var i=0;i<vA.length;i++) {
select.options[i] = new Option(vA[i],vA[i]);
}
}
function saveFrom() {
google.script.run
.withSuccessHandler(function(fObj){
$('#from').val(fObj.fromrange);
gfrom=fObj;
})
.saveFrom();
}
function saveTo() {
google.script.run
.withSuccessHandler(function(tObj){
$('#to').val(tObj.torange);
gto=tObj;
})
.saveTo();
}
function doit() {
var cObj={};
cObj['fromrg']=gfrom.fromrange;
cObj['fromsh']=gfrom.fromsheet;
cObj['torg']=gto.torange;
cObj['tosh']=gto.tosheet;
google.script.run.doIt(cObj);
}
function gotoSheet() {
google.script.run.gotoSheet($('#sel1').val());
}
console.log('My Code');
</script>
</body>
</html>
代码.gs:
function saveFrom() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=ss.getActiveRange();
return {fromsheet:sh.getName(),fromrange:rg.getA1Notation()};
}
function saveTo() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=ss.getActiveRange();
return {tosheet:sh.getName(),torange:rg.getA1Notation()};
}
function doIt(obj) {
var ss=SpreadsheetApp.getActive();
var fsh=ss.getSheetByName(obj.fromsh);
var frg=fsh.getRange(obj.fromrg);
var tsh=ss.getSheetByName(obj.tosh);
var trg=tsh.getRange(obj.torg);
frg.copyTo(trg);
}
function getSelections() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets();
var sA=shts.map(function(s){return s.getName();});
return sA;
}
function gotoSheet(name) {
var ss=SpreadsheetApp.getActive();
ss.getSheetByName(name).activate();
}
function copyRanges() {
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('ah3'), "Copy From One Range to Another")
}
运行 copyRanges 启动了整个过程。
动画:
这就是我认为我会重写你的代码的方式。但是我在这里猜测了一下,因为我真的不知道您要完成什么。
function printIng() {
var ss=SpreadsheetApp.getActive();
var ash=ss.getActiveSheet();
var ashname=ash.getName();
var currentCell=ash.getActiveCell();
if(ashname != "Indice Ricette" && ashname != "Template" && ashname != "Ingrediente" && ashname != "Impostazioni" && ashname != "Tipologia"){
我不明白上述条件的目的,但很明显,除非case bianca
或除 if 状态中的名称之外的其他工作表名称是活动工作表,否则你永远不会到达这里
//The only sh that makes it to here is Base Bianca
var nameRicetta=ss.getActiveSheet().getRange('C4').getValue();//so this makes no sense
var ui=SpreadsheetApp.getUi();
var result=ui.alert('Please confirm','Are you sure you want create'+ '['+ nameRicetta +'] ingredient?',ui.ButtonSet.YES_NO);
if (response == ui.Button.YES) {
var sh=ss.getSheetByName("Ingredienti");
var dataRange=sh.getDataRange();
var columnToCheck=sh.getRange(1,1,sh.getLastRow(),1).getValues();
var lastRow=sh.getLastRow()+1;
sh.getRange(lastRow,1,1,1).setFormula('='+ nameRicetta +'\!Y2');
sh.getRange(lastRow,2,1,1).setFormula('='+ nameRicetta +'\!Y2');
sh.getRange(lastRow,3,1,1).setFormula('='+ nameRicetta +'\!Y2');
sh.getRange(lastRow,4,1,1).setFormula('='+ nameRicetta +'!Y2');
sh.getRange(lastRow,5,1,1).setFormula('='+ nameRicetta +'!Y5');
sh.getRange(lastRow,6,1,1).setFormula('='+ nameRicetta +'!Y8');
sh.getRange(lastRow,7,1,1).setFormula('='+ nameRicetta +'!Y11')
sh.getRange(lastRow,8,1,1).setValue('0');
sh.getRange(lastRow,9,1,1).setValue('0');
sh.getRange(lastRow,10,1,1).setFormula('='+ nameRicetta +'!S25');
sh.getRange(lastRow,11,1,1).setFormula('='+ nameRicetta +'!Q25');
}
}
}
推荐阅读
- arrays - 我可以在 MongoDB 文档中修改数组的值,但它不会在数据库中更新
- javascript - 从未定义的数组值映射的反应按钮
- uiviewcontroller - iOS 13 PageSheet 父 UIViewController 不会变黑
- javascript - HTML字符串格式化函数算法的问题
- r - 有没有人可以使用 R 解释基本正则表达式的结果?
- android - java.lang.IllegalStateException: DataBindingUtil.inflate
(...) 在尝试使用 DataBindingUtil 膨胀时不能为空 - javascript - 将两个数组传递给函数,使用数据来启动按钮按下。Javascript
- laravel - Laravel - 没有一些数据的递归关系
- javascript - 当我尝试应用动态 css 大小属性时,应用程序渲染大于视口
- php - 在 PHP 中添加被覆盖的超链接