google-apps-script - 重复功能直到满足某些条件?谷歌表格/日历 API
问题描述
下面是我当前运行的用于从 Google 日历下载事件数据的脚本。它当前的编写方式是: 1) 每次运行时清除工作表,然后再填充新数据;2) 根据命令运行一次,从单个单元格 (D2) 值中提取日历 ID
我将大约 8 个不同的 Cal ID 保存到名为“CalIDs”的单独工作表中,每次运行脚本时我都会将其复制/粘贴到单元格 D2 中。完整过程是:粘贴第一个 Cal ID,运行脚本,将数据复制到另一个工作表中,粘贴第二个 Cal ID,运行脚本,将数据复制到另一个工作表中……重复此过程,直到所有 8 个 Cal ID 的数据都被提取并复制到另一张纸。
我想做的是修改这个脚本,让它像这样运行:引用'CalIDs'表的单元格A1来提取第一个日历的数据,转储到表中。然后检查 CalID 的 A2 中的值 - 如果不为空,请再次运行脚本,将第二个日历的数据拉到工作表中,附加到现有数据(不覆盖第一个数据,所以我想一个“查找第一个空行”类型的命令是需要)。继续此过程,直到找到 CalID 上 Col A 的第一个空单元格,然后结束。
有关如何执行此操作的任何帮助?我四处寻找,自己也没有找到任何答案。
function CalendarDownload(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(sheet.getSheetByName('PULL'))
var mycal = SpreadsheetApp.getActiveSheet().getRange("c2").getValue(); // PULL CALENDAR ID FROM CELL
var cal = CalendarApp.getCalendarById(mycal);
var startdate = SpreadsheetApp.getActiveSheet().getRange("a2").getValue() // SET THE DATE OF SEARCH RANGE
var enddate = SpreadsheetApp.getActiveSheet().getRange("b2").getValue() // SET THE DATE OF SEARCH RANGE
var editor = SpreadsheetApp.getActiveSheet().getRange("d2").getValue() // COLLECT CALENDER ID FROM CELL
var events = cal.getEvents(startdate, enddate); // SET THE DATE OF SEARCH RANGE
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(4, 1, sheet.getLastRow(), 9).clear({contentsOnly:true});
// Create a header record on the current spreadsheet in cells A1:N1 - Match the number of entries in the "header=" to the last parameter of the getRange entry below
var header = [["Event Start", "Event End", "Description", "EDITOR", "DURATION", "PROD #", "PHASE", "NOTES"]]
var range = sheet.getRange(3,1,1,8);
range.setValues(header);
// Loop through all calendar events found and write them out starting on calulated ROW 3 (i+3)
for (var i=0;i<events.length;i++) {
var row=i+4;
var myformula_placeholder = '';
var details=[[events[i].getStartTime(), events[i].getEndTime(), events[i].getTitle(), editor]];
var range=sheet.getRange(row,1,1,4);
range.setValues(details);
var cell=sheet.getRange(row,5);
cell.setFormula('=(HOUR(B' +row+ ')+(MINUTE(B' +row+ ')/60))-(HOUR(A' +row+ ')+(MINUTE(A' +row+ ')/60))');
cell.setNumberFormat('.00');
}
}
解决方案
我会像这样修改你的代码:
//******************************************************************************
function allCalendars(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var ss = sheet.getSheetByName('PULL');
var os = sheet.getSheetByName('CalIds');
var start = 2;
ss.getRange(4, 1, ss.getLastRow(), 9).clear({contentsOnly:true});
var data = os.getDataRange().getValues();
for (var i=0; i<data.length;i++)
{
start = CalendarDownload(start,data[i][0]);
}//for loop
}//*****************************************************************************
然后我修改了 CalendarDownload 一点:
function CalendarDownload(start,mycal){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(sheet.getSheetByName('PULL'))
var cal = CalendarApp.getCalendarById(mycal);
var startdate = SpreadsheetApp.getActiveSheet().getRange("a2").getValue() // SET THE DATE OF SEARCH RANGE
var enddate = SpreadsheetApp.getActiveSheet().getRange("b2").getValue() // SET THE DATE OF SEARCH RANGE
var editor = SpreadsheetApp.getActiveSheet().getRange("d2").getValue() // COLLECT CALENDER ID FROM CELL
var events = cal.getEvents(startdate, enddate); // SET THE DATE OF SEARCH RANGE
// Create a header record on the current spreadsheet in cells A1:N1 - Match the number of entries in the "header=" to the last parameter of the getRange entry below
var header = [["Event Start", "Event End", "Description", "EDITOR", "DURATION", "PROD #", "PHASE", "NOTES"]]
var range = sheet.getRange(3,1,1,8);
range.setValues(header);
// Loop through all calendar events found and write them out starting on calulated ROW 3 (i+3)
for (var i=0;i<events.length;i++) {
var row=i+4;
var myformula_placeholder = '';
var details=[[events[i].getStartTime(), events[i].getEndTime(), events[i].getTitle(), editor]];
var range=sheet.getRange((start+row),1,1,4);
range.setValues(details);
var cell=sheet.getRange(row,5);
cell.setFormula('=(HOUR(B' +row+ ')+(MINUTE(B' +row+ ')/60))-(HOUR(A' +row+ ')+(MINUTE(A' +row+ ')/60))');
cell.setNumberFormat('.00');
return sheet.getLastRow();
}
}
第一个函数循环遍历列表中的每个日历,第二个函数写入所有事件,然后将起始行传回下一个日历。
推荐阅读
- javascript - 带有 JSON GET 请求的 Ajax 未定义
- azure - 如何将 Azure ASE v1 迁移到 v2?
- javascript - bootstrap 4 - 模态表单,选择时不显示div
- javascript - Transform repetitive JQuery code into clean code
- plsql - 同一数据集的 2 个参考游标
- javascript - 滚动播放器最小化和浮动播放器不适用于 JW 播放器
- javascript - Chrome 似乎打破了 Youtube Embed API?
- sql - SQL query to bring back list of servers from specific date range
- python - 如何使用 python 从使用 php 和 javascript 的网页中解析信息
- amazon-web-services - Unable to register targets on AWS Target group