我如何重用此代码而不是复制和粘贴?
How do I reuse this code instead of copying and pasting?
我想创建事件并将其从我的日历同步到跨页sheet,反之亦然。
问题是我的 spreadsheet 中有 3 个 sheet,我想分别与不同的日历同步。
到目前为止,我已经做到了:
function eventosDatos() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var cal = CalendarApp.getCalendarById("calId");
for (i = 3; i <= hoja.getLastRow(); i++) {
var fecha = hoja.getRange(i, 8).getValue();
if (fecha > 0) {
var nombre = hoja.getRange(i, 3).getValue();
var id = hoja.getRange(i, 11).getValue();
if (id != 0) {
var ulte = hoja.getRange(i, 9).getValue();
var man = hoja.getRange(i, 10).getValue();
var ide = cal.getEventById(id);
var idf = ide.getAllDayStartDate();
var idn = ide.getTitle();
var ultev = ide.getLastUpdated();
if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
ide.setAllDayDate(fecha);
ide.setTitle(nombre);
hoja.getRange(i, 9).setValue(ide.getLastUpdated());
hoja.getRange(i, 10).setValue(true);
}
else if (ulte.valueOf() < ultev.valueOf()) {
hoja.getRange(i, 8).setValue(idf);
hoja.getRange(i, 3).setValue(idn);
hoja.getRange(i, 9).setValue(ultev);
hoja.getRange(i, 10).setValue(false);
}
}
else {
var nid = cal.createAllDayEvent(nombre, fecha).getId();
var nultev = cal.getEventById(nid).getLastUpdated();
hoja.getRange(i, 9).setValue(nultev);
hoja.getRange(i, 11).setValue(nid);
}
}
}
}
它完成了我想要的,但现在我一直在想办法重用它,而不是必须复制和粘贴它。
我考虑过像这样重新声明变量:
...
if (hoja.getSheetName()=="example 1"){
cal = CalendarApp.getCalendarById("calendar for example 1");
}
else if (hoja.getSheetName()=="example 2"){
cal = CalendarApp.getCalendarById("calendar for example 2");
}
...
但是如果没有我再次 运行 代码,它就不会是一个依次检查和更新所有 3 sheet 的循环。它只会检查活动的 sheet 并忽略其余部分,直到我转到另一个 sheet.
我还想在菜单中添加一个按钮。但我确实知道该怎么做。
我的猜测(我真的不太了解编程)是我正在寻找一种方法来制作一个检查和更新日历和 sheet 的函数,以及另一个分配正确的日历 ID 和 sheet 用于查找所有 3 个 sheet。并将后一个绑定到菜单中的单个按钮。
感谢任何帮助!
抱歉英语不好。
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Custom Menu')
.addItem('Update animal', 'updateAnimal')
.addItem('Update vegetable', 'updateVegetable')
.addItem('Update mineral', 'updateMineral')
.addItem('Update everything', 'updateAll')
.addToUi();
}
function updateAll() {
updateAnimal();
updateVegetable();
updateMineral();
}
function updateAnimal() {
// does the sheet with animal stuff exist
// does the calendar with animal stuff exist
// call the code and pass in the animal stuff ids
}
function updateVegetable() {
// does the sheet with vegetable stuff exist
// does the calendar with vegetable stuff exist
// call the code and pass in the vegetable stuff ids
}
function updateMineral() {
// does the sheet with mineral stuff exist
// does the calendar with mineral stuff exist
// call the code and pass in the mineral stuff ids
}
如果我理解的很好,你可以复用代码和接收参数,例如
function firstEjecution() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var callId = hoja.getSheetName(); // You could change the sheet name as Calendar Id
eventosDatos(calId,hoja);
}
function eventosDatos(calId,hoja) {
var cal = CalendarApp.getCalendarById(calId);
for (i = 3; i <= hoja.getLastRow(); i++) {
var fecha = hoja.getRange(i, 8).getValue();
if (fecha > 0) {
var nombre = hoja.getRange(i, 3).getValue();
var id = hoja.getRange(i, 11).getValue();
if (id != 0) {
var ulte = hoja.getRange(i, 9).getValue();
var man = hoja.getRange(i, 10).getValue();
var ide = cal.getEventById(id);
var idf = ide.getAllDayStartDate();
var idn = ide.getTitle();
var ultev = ide.getLastUpdated();
if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
ide.setAllDayDate(fecha);
ide.setTitle(nombre);
hoja.getRange(i, 9).setValue(ide.getLastUpdated());
hoja.getRange(i, 10).setValue(true);
}
else if (ulte.valueOf() < ultev.valueOf()) {
hoja.getRange(i, 8).setValue(idf);
hoja.getRange(i, 3).setValue(idn);
hoja.getRange(i, 9).setValue(ultev);
hoja.getRange(i, 10).setValue(false);
}
}
else {
var nid = cal.createAllDayEvent(nombre, fecha).getId();
var nultev = cal.getEventById(nid).getLastUpdated();
hoja.getRange(i, 9).setValue(nultev);
hoja.getRange(i, 11).setValue(nid);
}
}
}
}
我想创建事件并将其从我的日历同步到跨页sheet,反之亦然。
问题是我的 spreadsheet 中有 3 个 sheet,我想分别与不同的日历同步。 到目前为止,我已经做到了:
function eventosDatos() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var cal = CalendarApp.getCalendarById("calId");
for (i = 3; i <= hoja.getLastRow(); i++) {
var fecha = hoja.getRange(i, 8).getValue();
if (fecha > 0) {
var nombre = hoja.getRange(i, 3).getValue();
var id = hoja.getRange(i, 11).getValue();
if (id != 0) {
var ulte = hoja.getRange(i, 9).getValue();
var man = hoja.getRange(i, 10).getValue();
var ide = cal.getEventById(id);
var idf = ide.getAllDayStartDate();
var idn = ide.getTitle();
var ultev = ide.getLastUpdated();
if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
ide.setAllDayDate(fecha);
ide.setTitle(nombre);
hoja.getRange(i, 9).setValue(ide.getLastUpdated());
hoja.getRange(i, 10).setValue(true);
}
else if (ulte.valueOf() < ultev.valueOf()) {
hoja.getRange(i, 8).setValue(idf);
hoja.getRange(i, 3).setValue(idn);
hoja.getRange(i, 9).setValue(ultev);
hoja.getRange(i, 10).setValue(false);
}
}
else {
var nid = cal.createAllDayEvent(nombre, fecha).getId();
var nultev = cal.getEventById(nid).getLastUpdated();
hoja.getRange(i, 9).setValue(nultev);
hoja.getRange(i, 11).setValue(nid);
}
}
}
}
它完成了我想要的,但现在我一直在想办法重用它,而不是必须复制和粘贴它。
我考虑过像这样重新声明变量:
...
if (hoja.getSheetName()=="example 1"){
cal = CalendarApp.getCalendarById("calendar for example 1");
}
else if (hoja.getSheetName()=="example 2"){
cal = CalendarApp.getCalendarById("calendar for example 2");
}
...
但是如果没有我再次 运行 代码,它就不会是一个依次检查和更新所有 3 sheet 的循环。它只会检查活动的 sheet 并忽略其余部分,直到我转到另一个 sheet.
我还想在菜单中添加一个按钮。但我确实知道该怎么做。
我的猜测(我真的不太了解编程)是我正在寻找一种方法来制作一个检查和更新日历和 sheet 的函数,以及另一个分配正确的日历 ID 和 sheet 用于查找所有 3 个 sheet。并将后一个绑定到菜单中的单个按钮。
感谢任何帮助!
抱歉英语不好。
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Custom Menu')
.addItem('Update animal', 'updateAnimal')
.addItem('Update vegetable', 'updateVegetable')
.addItem('Update mineral', 'updateMineral')
.addItem('Update everything', 'updateAll')
.addToUi();
}
function updateAll() {
updateAnimal();
updateVegetable();
updateMineral();
}
function updateAnimal() {
// does the sheet with animal stuff exist
// does the calendar with animal stuff exist
// call the code and pass in the animal stuff ids
}
function updateVegetable() {
// does the sheet with vegetable stuff exist
// does the calendar with vegetable stuff exist
// call the code and pass in the vegetable stuff ids
}
function updateMineral() {
// does the sheet with mineral stuff exist
// does the calendar with mineral stuff exist
// call the code and pass in the mineral stuff ids
}
如果我理解的很好,你可以复用代码和接收参数,例如
function firstEjecution() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var callId = hoja.getSheetName(); // You could change the sheet name as Calendar Id
eventosDatos(calId,hoja);
}
function eventosDatos(calId,hoja) {
var cal = CalendarApp.getCalendarById(calId);
for (i = 3; i <= hoja.getLastRow(); i++) {
var fecha = hoja.getRange(i, 8).getValue();
if (fecha > 0) {
var nombre = hoja.getRange(i, 3).getValue();
var id = hoja.getRange(i, 11).getValue();
if (id != 0) {
var ulte = hoja.getRange(i, 9).getValue();
var man = hoja.getRange(i, 10).getValue();
var ide = cal.getEventById(id);
var idf = ide.getAllDayStartDate();
var idn = ide.getTitle();
var ultev = ide.getLastUpdated();
if ((ulte.valueOf() > ultev.valueOf()) && man == false) {
ide.setAllDayDate(fecha);
ide.setTitle(nombre);
hoja.getRange(i, 9).setValue(ide.getLastUpdated());
hoja.getRange(i, 10).setValue(true);
}
else if (ulte.valueOf() < ultev.valueOf()) {
hoja.getRange(i, 8).setValue(idf);
hoja.getRange(i, 3).setValue(idn);
hoja.getRange(i, 9).setValue(ultev);
hoja.getRange(i, 10).setValue(false);
}
}
else {
var nid = cal.createAllDayEvent(nombre, fecha).getId();
var nultev = cal.getEventById(nid).getLastUpdated();
hoja.getRange(i, 9).setValue(nultev);
hoja.getRange(i, 11).setValue(nid);
}
}
}
}