我想做一個腳本,回圈瀏覽一個下拉串列并為每個串列創建一個PDF。
首先,我想檢查B2是否為空,如果是,則創建pdf,然后將A2改為下一個選項,直到所有選項都完成。我有一個基本的腳本,但請不要介意!
我有一個基本的腳本,但請不要介意。
function loopScript(){
const ss = SpreadsheetApp.getActiveSpreadsheet()。
const interface = ss.getSheetByName("Interface"/span>)。
var folderID = "###GOOGLE DRIVE FOLDER ID###"/span>。
var folder = DriveApp.getFolderById(folderID)。
const exportOptions = 'exportFormat=pdf& format=pdf'
'&size=A4'/span>
'&portrait=true'
'&scale=4'
'&fith=true& source=labnol'
'&top_margin=0.05'/span>
'& bottom_margin=0.05'
'&left_margin=1.00'/span>
'&right_margin=0.25'/span>
'&sheetnames=false&printttitle=false'
'&pagenumbers=false&gridlines=false'/span>
'&fzr=false'/span>
'&gid=125740569'。
var params = {method:"GET", headers: {"authorization":"Bearer" ScriptApp. getOAuthToken()}}。
var response = UrlFetchApp.fetch(url exportOptions, params).getBlob()。
const nameFile = "NAME OF FILE"/span> ".pdf"/span> ;
folder.createFile(response.setName(nameFile) )。
DriveApp.createFile(response.setName(nameFile))。
uj5u.com熱心網友回復:
我相信你的目標如下。
Joe, Barry, Jane, Fred并且單元格 "A2 "是Barry時,你想將該單元格設定為Jane。
在這種情況下,下面這個修改后的腳本怎么樣?
修改后的腳本:
從:
const ss = SpreadsheetApp.getActiveSpreadsheet()。
const interface = ss.getSheetByName("Interface"/span>)。
致:
const ss = SpreadsheetApp.getActiveSpreadsheet() 。
const interface = ss.getSheetByName("Interface"/span>)。
if (interface.getRange("B2"/span>).isBlank()) return;
const range = interface.getRange("A2"/span>)。
const values = [...new Set(range.getDataValidation)。 getCriteriaValues()[0].getValues().flat() ] 。]
const nextValue = values[values.indexOf(range.getValue() 1]。|| values[0]。
range.setValue(nextValue)。
- 在這個修改后的腳本中,當單元格 "B2 "為空時,腳本就完成了。當單元格 "B2 "不為空時,腳本運行,單元格 "A2 "被更新,你創建PDF檔案的腳本被運行。
注:
- 在上述修改后的腳本中,當下拉串列為
- 在你當前的腳本中,
url沒有被定義。請注意這一點。
Joe, Barry, Jane, Fred且單元格 "A2 "為Fred時,Joe的值被設定。如果你想改變這一點,請修改上述腳本。
參考資料:
uj5u.com熱心網友回復:
問題:
如果我沒有理解錯的話,你想做以下事情:
如果我沒有理解錯的話,你想做以下事情:
A2中的每個下拉選單,檢查B2中的公式是否填充了任何值(基于表Data的資料)。
B中由于公式而填充了任何值,使用A2的值為檔案名創建一個PDF檔案(您已經實作了這一點)。
方法1:
在這種情況下,我建議采用以下作業流程:
- 從
A2下拉選單中獲取一個包含被接受的值的陣列(你可以使用Tanaike的答案中使用的方法)。 - 遍歷這些
值,對于每一個,設定A2值,使用Range.setValue。 - 呼叫flush,以便根據
A2中的當前值更新B2中的資料。 。
- 檢查
B2是否為空白(例如,使用Range.isBlank)。 - 如果
B2不是空白,則創建驅動器檔案。
function loopScript(){
const ss = SpreadsheetApp.getActiveSpreadsheet()。
const interface = ss.getSheetByName("Interface"/span>)。
const range = interface.getRange("A2") 。
const values = [...new Set(range.getDataValidation)。 getCriteriaValues()[0].getValues() 。 flat()].filter(String)。
values.forEach(name => {
range.setValue(name)。
SpreadsheetApp.flush()。
if (!interface.getRange("B2"/span>).isBlank() {
//創建檔案的代碼。
}
});
}
方法2:
在前面的方法中,setValue、flush、getRange和isBlank被反復使用,大大增加了對電子表格的呼叫量。這并不是最好的做法,因為它將降低腳本的速度(參見盡量減少對其他服務的呼叫),而且如果下拉選單有更多的有效選項,這種情況將變得更加糟糕。
因此,由于下拉選單有更多的有效選項,這將使下拉選單變得更加復雜。
因此,由于該公式所使用的資料可以在作業表Data中找到,我建議使用該源資料而不是該公式,以盡量減少對電子表格的呼叫。
在這種情況下,你可以遵循這樣的作業流程:
- 使用Range.getValues一次性獲取
Data中的所有資料。 。
- 從
A2中獲取資料驗證中的所有有效選項,如方法1. 。
- 對于每個選項,檢查
Data中是否有任何一行在A列中有這個選項,并且在B中有一個非空單元格。 - 如果該選項有一些資料,則創建該檔案。
function loopScript(){
const ss = SpreadsheetApp.getActiveSpreadsheet()。
const interface = ss.getSheetByName("Interface"/span>)。
const data = ss.getSheetByName("Data") 。
const DATA_FIRST_ROW = 2;
const dataValues = data.getRange(DATA_FIRST_ROW,1, data. getLastRow()-DATA_FIRST_ROW 1,2)。) getValues()。
const range = interface.getRange("A2")。
const values = [...new Set(range.getDataValidation)。 getCriteriaValues()[0].getValues() 。 flat()].filter(String)。
values.forEach(name => {
const optionValues = dataValues. filter(dataRow => dataRow[0] ==name) 。
const nonEmpty = optionValues. some(optionValue => optionValue[1] !== "");
if (nonEmpty) {
//創建檔案的代碼。
}
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333003.html
標籤:

