今日作った部品。身近な処理を楽にするため、コツコツ作り貯め!
起動条件
このコードは、GoogleフォームのAppScriptから、トリガーを[フォームから] - [起動時]で関数initFormを設定して使う。
フォームを起動したタイミングでスクリプトが実行されプルダウンに指定フォルダのファイル名がセットされる。
実装イメージ
Driveにファイルを入れると…
プルダウンにファイル名が出てくる。
AppScript コード
//フォーム、フォルダのIDは環境に応じて書き換え
const envData = {
formId : 'フォームID',
folderItemsToListItem : [
{ questionTitle : 'フォームの質問タイトル1' ,
folderId : 'プルダウンにセットしたいフォルダID1'},
{ questionTitle : 'フォームの質問タイトル2' ,
folderId : 'プルダウンにセットしたいフォルダID2'}
]
}
// トリガー フォーム起動時:プルダウンリストをフォルダに入ってるファイル名で更新
function initForm() {
const form = FormApp.openById(envData.formId)
const items = form.getItems()
let getFileList = function(folderId) {
// フォルダのファイル名をリスト化
let fileNameList = []
let files = DriveApp.getFolderById(folderId).getFiles();
while (files.hasNext()) {
const file = files.next();
fileNameList.push(file.getName());
}
if(fileNameList.length == 0) { fileNameList.push("ファイルが見つかりませんでした。") }
return fileNameList
}
let updateListItem = function(questionTitle, itemList) {
// ファイル名のリストでプルダウン上書き
let qui
for (let frmIdx = 0; frmIdx < items.length; frmIdx++){
if (items[frmIdx].getTitle()==questionTitle){ //タイトルが一致するLISTを選択
que = items[frmIdx].asListItem() //変数quiにobjectを格納
let choices = []
for (let i = 0; i < itemList.length; i++){
choices.push(que.createChoice(itemList[i]));
}
que.setChoices(choices)
}
}
}
//事前定義した質問タイトルとフォルダIDでプルダウン更新を実行
let folderItemsToListItem = envData.folderItemsToListItem
for (let i=0; i < folderItemsToListItem.length; i++){
let folderFileNames = getFileList(folderItemsToListItem[i].folderId)
updateListItem(folderItemsToListItem[i].questionTitle, folderFileNames)
}
}
編集ポイント
最初の envData のとこに環境のフォームIDとかフォルダID埋める。
今回はたまたま複数の質問プルダウンにフォルダの中のファイルセットしたかったから質問タイトルとフォルダIDをセットで配列にしてぶっこめば全部設定されるようにしてみた。
経緯
たまたま、某システムから出力したCSVを加工したかったんだけども、どーやって処理動かすようにしようかなーと思ってDriveフォルダにおいてフォームからファイル選ばせて任意に送信トリガーでCSV処理したらどうだろ?っていう思いつきから部品を用意した。(おもっきし脱線して本処理まだ考えてない😋