繁体   English   中英

为每一行谷歌工作表循环一个应用程序脚本

[英]Looping an apps script for every row of google sheet

我创建了一个 HTML 文件,它将对时间表的响应发送到字符串中的电子表格。 我现在要做的是从每一行获取数据,并将其粘贴为可读格式,然后将其作为 PDF 发送到数据字符串中包含的 email 地址。 最终,我将让这个脚本从单独的工作表上的按钮运行(至于为什么我引用了 sheetID)。

我已经让脚本适用于一个字符串,但我仍然需要为每一行迭代代码,而不仅仅是一遍又一遍地复制和粘贴代码并更改值。

function sendPDF() {
  var spreadsheet = SpreadsheetApp.openById("1Zsinv7scuXLn1Eq-8frtMHOTnunFYtFk2x3iAynHkaU");
  var sh = spreadsheet.getSheets()[1]
  var sh1 = spreadsheet.getSheets()[0]
  var shName = sh.getName()
  var spreadsheeta = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('data dump'), true)
  var spreadsheetb = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('PDF file'), true)
  var paste = SpreadsheetApp.CopyPasteType.PASTE_VALUES

// below is the section that needs reiterating for each row in 'spreadsheeta'

spreadsheeta.getRange("A3").copyTo(spreadsheetb.getRange("D4"), paste, false);
spreadsheeta.getRange("D3").copyTo(spreadsheetb.getRange("H5"), paste,false);
spreadsheeta.getRange("H3:I3").copyTo(spreadsheetb.getRange("C9"), paste,false);
spreadsheeta.getRange("J3:K3").copyTo(spreadsheetb.getRange("F9"), paste,false);
spreadsheeta.getRange("R3:S3").copyTo(spreadsheetb.getRange("C10"), paste,false);
spreadsheeta.getRange("T3:U3").copyTo(spreadsheetb.getRange("F10"), paste,false);
spreadsheeta.getRange("AB3:AC3").copyTo(spreadsheetb.getRange("C11"), paste,false);
spreadsheeta.getRange("AD3:AE3").copyTo(spreadsheetb.getRange("F11"), paste,false);
spreadsheeta.getRange("AL3:AM3").copyTo(spreadsheetb.getRange("C12"), paste,false);
spreadsheeta.getRange("AN3:AO3").copyTo(spreadsheetb.getRange("F12"), paste,false);
spreadsheeta.getRange("AV3:AW3").copyTo(spreadsheetb.getRange("C13"), paste,false);
spreadsheeta.getRange("AX3:AY3").copyTo(spreadsheetb.getRange("F13"), paste,false);
spreadsheeta.getRange("BF3:BG3").copyTo(spreadsheetb.getRange("C14"), paste,false);
spreadsheeta.getRange("BH3:BI3").copyTo(spreadsheetb.getRange("F14"), paste,false);
spreadsheeta.getRange("BP3:BQ3").copyTo(spreadsheetb.getRange("C15"), paste,false);
spreadsheeta.getRange("BR3:BS3").copyTo(spreadsheetb.getRange("F15"), paste,false);
spreadsheeta.getRange("BZ3:CA3").copyTo(spreadsheetb.getRange("C16"), paste,false);
spreadsheeta.getRange("CB3:CC3").copyTo(spreadsheetb.getRange("F16"), paste,false);
spreadsheeta.getRange("CJ3:CK3").copyTo(spreadsheetb.getRange("C17"), paste,false);
spreadsheeta.getRange("CL3:CM3").copyTo(spreadsheetb.getRange("F17"), paste,false);
spreadsheeta.getRange("CT3:CU3").copyTo(spreadsheetb.getRange("C18"), paste,false);
spreadsheeta.getRange("CV3:CW3").copyTo(spreadsheetb.getRange("F18"), paste,false);
spreadsheeta.getRange("DD3:DE3").copyTo(spreadsheetb.getRange("C19"), paste,false);
spreadsheeta.getRange("DF3:DG3").copyTo(spreadsheetb.getRange("F19"), paste,false);
spreadsheeta.getRange("DN3:DO3").copyTo(spreadsheetb.getRange("C20"), paste,false);
spreadsheeta.getRange("DP3:DQ3").copyTo(spreadsheetb.getRange("F20"), paste,false);
spreadsheeta.getRange("DN3:DO3").copyTo(spreadsheetb.getRange("C20"), paste,false);
spreadsheeta.getRange("DP3:DQ3").copyTo(spreadsheetb.getRange("F20"), paste,false);
spreadsheeta.getRange("DX3:DY3").copyTo(spreadsheetb.getRange("C21"), paste,false);
spreadsheeta.getRange("DZ3:EA3").copyTo(spreadsheetb.getRange("F21"), paste,false);
spreadsheeta.getRange("EH3:EI3").copyTo(spreadsheetb.getRange("C22"), paste,false);
spreadsheeta.getRange("EJ3:EK3").copyTo(spreadsheetb.getRange("F22"), paste,false);
spreadsheeta.getRange("ER3:ES3").copyTo(spreadsheetb.getRange("C23"), paste,false);
spreadsheeta.getRange("ET3:EU3").copyTo(spreadsheetb.getRange("F23"), paste,false);
spreadsheeta.getRange("FB3:FC3").copyTo(spreadsheetb.getRange("C24"), paste,false);
spreadsheeta.getRange("FD3:FE3").copyTo(spreadsheetb.getRange("F24"), paste,false);
spreadsheeta.getRange("E3").copyTo(spreadsheetb.getRange("H28"), paste,false);

  sendSpreadsheetToPdf(1, shName, sh1.getRange('B3').getValue(),"test email with the adress in cell A1 ", "This is it !");
};

//I've then got another function to print and sent the pdf to the recipient in cell b3

代替

var spreadsheeta = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('data dump'), true)
var spreadsheetb = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('PDF file'), true)

经过

var spreadsheeta = spreadsheet.getSheetByName('data dump');
var spreadsheetb = spreadsheet.getSheetByName('PDF file');

这将使您的脚本更快。

然后不使用 A1 符号范围引用作为Sheet.getRange()的参数,而是使用行、列、行数和列数作为参数,即

  • 代替spreadsheeta.getRange("A3")使用spreadsheeta.getRange(i,1)
  • 取而代之的是电子表格a.getRange spreadsheeta.getRange("H3:I3")使用spreadsheeta.getRange(i,8,1,2)

其中i是将在每次循环迭代中修改的变量,即

for(let i = 3; i <= spreadsheeta.getLastRow(); i++){
  // put here the stuff to be done on each iteration
}

注意:Google Apps 脚本对免费帐户的最长执行时间配额为 6 分钟,对 Workspace 帐户的最长执行时间配额为 30 分钟。 考虑到这一点,您可能必须分批处理行。 另一种选择是使用 Advanced Sheets Service 中的batchUpdate

有关的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM