当 sheet 名称以 X google apps 脚本开头时循环执行脚本
loop through a script when a sheet name begins with X google apps script
通常,当您在 google 个工作表文档中创建一个或多个工作表时,这些默认称为“Sheet 1”、“Sheet 2”、“Sheet 3" ...
我正在尝试,当手动创建一个或多个新工作表时,脚本会自动激活并检测哪些工作表以名称“Sheet”开头。
在名称以“Sheet”开头的工作表上,脚本将应用样式。
我已经在 google 应用程序脚本中创建了一个代码,但问题是由于某些原因我的代码似乎无法工作...
这是我的代码:
function newSheet(){
var libro = SpreadsheetApp.getActiveSpreadsheet();
var numeroDeHojas = libro.getNumSheets();
for (var i = 0; i < numeroDeHojas; i++) {
var hojass = libro.getSheets()[i];
var nombreHoja = hojass.getName();
Logger.log(hojass);
Logger.log(nombreHoja);
if ( nombreHoja == nombreHoja.toString().indexOf('Hoja') ){
hojass.setHiddenGridlines(true); // Ocultar las lineas de cuadricula
hojass.setColumnWidth(1, 50); //Modificar tamaño de columna A de las hojas a 50
hojass.getRange(1, 1, hojass.getMaxRows(), hojass.getMaxColumns()).activate(); //Seleccionar toda las celdas de la hoja
hojass.getActiveRangeList().setVerticalAlignment('middle').setFontFamily('Open Sans'); //Dar alineación vertical en el medio y fuente Open Sans
hojass.getRange('A1').activate(); //Quitar la seleccion de todas las celdas de la hoja y activar solo la celda A1
}
}
}
有人会这么好心帮助我吗?非常感谢任何帮助。
非常感谢
我让你的功能正常工作:)
有两点需要注意。
设置触发器
我不知道你是否这样做了,触发器是否正常工作,但你需要一个像这样的 onChange
触发器(只需从 IDE 直接执行一次):
const setTrigger = () => {
const sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("newSheet")
.forSpreadsheet(sheet)
.onChange()
.create();
}
您的 newSheet()
函数随后将接收一个事件作为其参数。出于性能原因,您可能希望像这样重构函数的开头:
function newSheet(e){ // e is the event passed by the trigger
if(e.changeType !== "INSERT_GRID") return; // don't run if the function was triggered by something which is not a creation of a new sheet
// rest of the code as is
}
这确保您不会无用地 运行 函数,但只有在创建新的 sheet 时才会如此。
你的if
说法是错误的
这是测试 indexOf
返回值的正确方法:
if (-1 !== nombreHoja.indexOf('Hoja')) {
// the actual code is fine
}
还可以对您的代码进行一些其他改进,但它确实按原样工作,所以您应该没问题;)
通常,当您在 google 个工作表文档中创建一个或多个工作表时,这些默认称为“Sheet 1”、“Sheet 2”、“Sheet 3" ...
我正在尝试,当手动创建一个或多个新工作表时,脚本会自动激活并检测哪些工作表以名称“Sheet”开头。
在名称以“Sheet”开头的工作表上,脚本将应用样式。
我已经在 google 应用程序脚本中创建了一个代码,但问题是由于某些原因我的代码似乎无法工作...
这是我的代码:
function newSheet(){
var libro = SpreadsheetApp.getActiveSpreadsheet();
var numeroDeHojas = libro.getNumSheets();
for (var i = 0; i < numeroDeHojas; i++) {
var hojass = libro.getSheets()[i];
var nombreHoja = hojass.getName();
Logger.log(hojass);
Logger.log(nombreHoja);
if ( nombreHoja == nombreHoja.toString().indexOf('Hoja') ){
hojass.setHiddenGridlines(true); // Ocultar las lineas de cuadricula
hojass.setColumnWidth(1, 50); //Modificar tamaño de columna A de las hojas a 50
hojass.getRange(1, 1, hojass.getMaxRows(), hojass.getMaxColumns()).activate(); //Seleccionar toda las celdas de la hoja
hojass.getActiveRangeList().setVerticalAlignment('middle').setFontFamily('Open Sans'); //Dar alineación vertical en el medio y fuente Open Sans
hojass.getRange('A1').activate(); //Quitar la seleccion de todas las celdas de la hoja y activar solo la celda A1
}
}
}
有人会这么好心帮助我吗?非常感谢任何帮助。
非常感谢
我让你的功能正常工作:)
有两点需要注意。
设置触发器
我不知道你是否这样做了,触发器是否正常工作,但你需要一个像这样的 onChange
触发器(只需从 IDE 直接执行一次):
const setTrigger = () => {
const sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("newSheet")
.forSpreadsheet(sheet)
.onChange()
.create();
}
您的 newSheet()
函数随后将接收一个事件作为其参数。出于性能原因,您可能希望像这样重构函数的开头:
function newSheet(e){ // e is the event passed by the trigger
if(e.changeType !== "INSERT_GRID") return; // don't run if the function was triggered by something which is not a creation of a new sheet
// rest of the code as is
}
这确保您不会无用地 运行 函数,但只有在创建新的 sheet 时才会如此。
你的if
说法是错误的
这是测试 indexOf
返回值的正确方法:
if (-1 !== nombreHoja.indexOf('Hoja')) {
// the actual code is fine
}
还可以对您的代码进行一些其他改进,但它确实按原样工作,所以您应该没问题;)