简体   繁体   English

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

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

I've created a HTML file that sends responses to a timesheet to a spreadsheet in a string.我创建了一个 HTML 文件,它将对时间表的响应发送到字符串中的电子表格。 What I'm now trying to do is take the data from each row, and pasting it into a readable format, which is then sent off as a PDF to the email address included in the string of data.我现在要做的是从每一行获取数据,并将其粘贴为可读格式,然后将其作为 PDF 发送到数据字符串中包含的 email 地址。 Eventually I will make this script run from a button on a separate sheet (as to why I've made reference to the sheetID).最终,我将让这个脚本从单独的工作表上的按钮运行(至于为什么我引用了 sheetID)。

I've got the script working for one string, but I still need to make the code iterative for each row, without just copying and pasting the code over and over and changing the values.我已经让脚本适用于一个字符串,但我仍然需要为每一行迭代代码,而不仅仅是一遍又一遍地复制和粘贴代码并更改值。

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

Replace代替

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

by经过

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

This will make your script faster.这将使您的脚本更快。

Then instead of using the A1 notation range references as parameter of Sheet.getRange() use row, column, number of rows and number of columns as parameters, ie然后不使用 A1 符号范围引用作为Sheet.getRange()的参数,而是使用行、列、行数和列数作为参数,即

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

where i is a variable that will be modified on each loop iteration, ie,其中i是将在每次循环迭代中修改的变量,即

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

Note: Google Apps Script has a maximum execution time quota of 6 minutes for free accounts, and 30 minutes for Workspace accounts.注意:Google Apps 脚本对免费帐户的最长执行时间配额为 6 分钟,对 Workspace 帐户的最长执行时间配额为 30 分钟。 Considering this, you might have to process the rows in batches.考虑到这一点,您可能必须分批处理行。 One alternative option is to use batchUpdate from the Advanced Sheets Service.另一种选择是使用 Advanced Sheets Service 中的batchUpdate

Related有关的

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

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