前回作成したGASをスプレッドシート上で設定できるようにしていきます!
前回の記事はこちら!
取込設定シートの作成
今回は下記のサンプルデータを入れた状態で
スプレッドシートの設定を使って取り込む処理を作りこみます。
シートの作りこみ
最低限この情報だけでも取り込めますがもう少し設定を増やしておきます。
取込設定列と取込時刻列を追加しました。また、複数ファイル取り込みできるような仕様とします。
GASの改造
前回作成したプログラムを改良します。
前回の記事はこちら!
GASの作りこみ
シート上に作成したシート名とCsv名をGAS上では変数に変更し
シートの設定表を基に動作するように改良します。
メインプログラムとサブプログラムに分ける
前回作成した処理をサブプログラムとしてメインプログラムから呼び出す仕様とします。
メインプログラムの作成
前回作成した処理をサブプログラムとしてメインプログラムから呼び出す仕様とします。
プログラムは下記のようになりました。
取込設定が使用中の時だけサブプログラムを
起動するようにします。
前回作成したサブプログラムはImportCsvProcess
なのでそれに引数を追加しメインプログラムで
読ませた変数を渡します。
function ImportCsvMain()
{ //Csv取り込み処理メイン
const spradsheet = SpreadsheetApp.getActiveSpreadsheet();
const settingsheet = spradsheet.getSheetByName(‘シート名’);
var i = 4;
while(settingsheet.getRange(‘C’+ i).getValue() != “”)//C列が空白じゃない間繰り返し
{
var pastesheetname = settingsheet.getRange(‘C’+i).getValue();
var csvname = settingsheet.getRange(‘D’+i).getValue();
if(settingsheet.getRange(‘B’+i).getValue()== “使用中”)
{
ImportCsvProcess(pastesheetname,csvname,settingsheet,i)//サブプログラムを記載する
}
console.log(pastesheetname)
i = i + 1
}
}
サブプログラムの改良
サブプログラムの改良の部分は下記のとおりです。
・メインプログラムの変数の渡す部分の設定
・貼り付けシート名を変数にしたのでその反映
・Csv名をシートに取り込むファイル名が違うのでその部分の制御
引数の受け渡しの部分は呼び出しのとこと同じにすればOKです。
function ImportCsvProcess(pastesheetname,csvname,settingsheet,i)
シート名は受け渡した変数を入れます。
const sheet = spradsheet.getSheetByName(pastesheetname);
csv名の監視部分ですが前回作成時に取得したファイル名と比較をさせます。
IF分を作成して{}内に取込処理を記載します。
if(filename.match(csvname)){}
今回改造したサブプログラムはこんな感じです。
function ImportCsvProcess(pastesheetname,csvname,settingsheet,i)
{
console.log(‘取込処理’)
const importfolder = DriveApp.getFolderById(‘1JYskMFKkqbXmu9fC7XRKWJ3k7pm6HpH5’); //取り込むフォルダのIDに変更する
const archivefolder = DriveApp.getFolderById(’18m1hDFGZJpbWj-IeOEA_AbtVxuYcYACP’);//取り込み済みの格納先IDに変更する
const spradsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spradsheet.getSheetByName(pastesheetname);//貼り付けるシート名を記載する
const readfiles = importfolder.getFiles();
while (readfiles.hasNext())
{
const file = readfiles.next();
const filename = file.getName();
const url = file.getUrl();
const fileid = file.getId();
console.log(file.getName())
if(filename.match(csvname))//検索したファイル名の場合取込処理を行う
{
const blob = DriveApp.getFileById(fileid).getBlob();
const csv = blob.getDataAsString(‘Shift-JIS’);
const values = Utilities.parseCsv(csv);
sheet.clear();//貼り付け先シート全消し
sheet.getRange(1,1,values.length,values[0].length).setValues(values);//csvを貼り付け
file.moveTo(archivefolder);//ファイルを格納
let date = new Date()
settingsheet.getRange(‘E’+i).setValue(date); //設定シートに取込時刻書き込み
}
}
}
トリガーを設定して処理を自動化する
Importフォルダにファイルが置かれたら自動的に取り込む処理にした方が良いですよね。
GASのトリガーの所から設定することができます。
イベントのソースを選択:時間主導型
時間ベースのトリガータイプを選択:分ベースのタイマー
時間の感覚を選択(分):10分おき
このように設定すると10分おきに処理が流れるようになります。
この部分は好みの時間に変更して使用してください。
最後に保存を押して作成完了です!
作成した処理を動かしてみる
csvをImportフォルダに設置してみます。
わざと関係ないファイルも設置
この状態で待つとトリガーによって取込処理が流れます。
取込処理が起きると設定したファイルのみ取込が行われます!
取込のシートにも反映されていました!
まとめ
いかがでしたでしょうか。設定部分をシートに持たせるとGASの改良が少なくて済むので
是非参考にしてみてください!次回はCsvを取り込んだ際に新規書き込みだけだと追記できないので
追記か新規書き込みか選べる仕様に改良したいと思います。
また、Googleドライブの格納後のファイルも不要分は処理できるような仕組みを考えます。
今回作成したプログラムは下記のとおりです。
function ImportCsvMain()
{ //Csv取り込み処理メイン
const spradsheet = SpreadsheetApp.getActiveSpreadsheet();
const settingsheet = spradsheet.getSheetByName(‘シート名’);
var i = 4;
while(settingsheet.getRange(‘C’+ i).getValue() != “”)//C列が空白じゃない間繰り返し
{
var pastesheetname = settingsheet.getRange(‘C’+i).getValue();
var csvname = settingsheet.getRange(‘D’+i).getValue();
if(settingsheet.getRange(‘B’+i).getValue()== “使用中”)
{
ImportCsvProcess(pastesheetname,csvname,settingsheet,i)//サブプログラムを記載する
}
console.log(pastesheetname)
i = i + 1
}
}
function ImportCsvProcess(pastesheetname,csvname,settingsheet,i)
{
console.log(‘取込処理’)
const importfolder = DriveApp.getFolderById(‘1JYskMFKkqbXmu9fC7XRKWJ3k7pm6HpH5’); //取り込むフォルダのIDに変更する
const archivefolder = DriveApp.getFolderById(’18m1hDFGZJpbWj-IeOEA_AbtVxuYcYACP’);//取り込み済みの格納先IDに変更する
const spradsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spradsheet.getSheetByName(pastesheetname);//貼り付けるシート名を記載する
const readfiles = importfolder.getFiles();
while (readfiles.hasNext())
{
const file = readfiles.next();
const filename = file.getName();
const url = file.getUrl();
const fileid = file.getId();
console.log(file.getName())
if(filename.match(csvname))//検索したファイル名の場合取込処理を行う
{
const blob = DriveApp.getFileById(fileid).getBlob();
const csv = blob.getDataAsString(‘Shift-JIS’);
const values = Utilities.parseCsv(csv);
sheet.clear();//貼り付け先シート全消し
sheet.getRange(1,1,values.length,values[0].length).setValues(values);//csvを貼り付け
file.moveTo(archivefolder);//ファイルを格納
let date = new Date()
settingsheet.getRange(‘E’+i).setValue(date); //設定シートに取込時刻書き込み
}
}
}
コメント