3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoogleスプレッドシートにGoogleDriveのフォルダの中の一覧を書き出す

Last updated at Posted at 2018-09-13

お世話になります。

##1.初めに
弊社は現場ごとに資材を取り寄せることがあり、資材が良く余ることがあります。
そのため別の営業所と不良在庫になってしまったものをグーグルスプレッドシートで共有したいという相談があり作成しました。
簡単な概要としては特定のフォルダにエクセルをアップするとエクセル名とGoogleDriveのURLをスプレッドシートに出力するスクリプトになっています。

ちなみに私はエンジニアではないのでコードの綺麗さについては個人的には追及してるつもりですが、甘さしかないと思うので
こういう書き方のほうがすっきりするし効率もいいよ!などという指摘がございましたら是非ともお願いしたいです。

##2.見た目
キャプチャ.PNG
フォルダはIDを指定しているので好きなように作成していただいて大丈夫です。
私は一つフォルダを作成しその中に各種フォルダを作成しています。

##3.コード

  var sheet = SpreadsheetApp.openById("出力したいスプレッドシートのID");  //スプレッドシートのIDを指定
  var i = 2; //書き込み初期位置
  var folder; 
 var name;
  var file;
  var sheet1;
  var contents;

function start(){  //全ての関数を実行
  kabe();
  yuka();
  den();
  mizu();
  other();
  reset();
}

function reset(){  //値を初期化
  i = 2;
  folder = "";
  name = "";
  file = "";
  sheet1 = "";
  contents = "";
}
  
function kabe() { //壁廻りのシートを編集
  sheet1 = sheet.getSheetByName("壁廻り"); //シート名を指定
  folder = DriveApp.getFolderById("壁廻りフォルダのIDを指定"); //壁廻りのフォルダIDを指定
  go();
}
function yuka(){
  sheet1 = sheet.getSheetByName("床廻り");
  folder = DriveApp.getFolderById("床廻りフォルダのIDを指定");
  go();
}
  
function den(){
  sheet1 = sheet.getSheetByName("電材");
  folder = DriveApp.getFolderById("電材フォルダのIDを指定"); 
  go();
}
  
function mizu(){
  sheet1 = sheet.getSheetByName("水廻り");
  folder = DriveApp.getFolderById("水廻りフォルダのIDを指定");
  go(); 
}  
function other(){
  sheet1 = sheet.getSheetByName("その他"); 
  folder = DriveApp.getFolderById("その他フォルダのIDを指定");
  go();
}

function go(){
  contents = folder.getFiles();
  sheet1.getRange("A2:B1000").clear();
  while(contents.hasNext()) {
    file = contents.next();
    name = file.getId();
    sheet1.getRange(i,1).setValue(file);
    sheet1.getRange(i,2).setValue('グーグルドライブのURLのIDより前を指定' + name + 'グーグルドライブのURLのIDより後を指定');//※1
    i= i+ 1;
   }
  i = 2;
  reset();
} 

##4.コードの解説
各functionにてシートのIDとIDをグローバル変数に代入しgoへ飛ばし処理をしています。

goの処理ですが、folder.getFiles()にてfolderで指定したIDのフォルダーの中身を何かの形で全て取得してきます。
※ファイル名とかではなかったはず。ちょっと特殊な形?だったはず・・・詳しくはリファレンスを見てもらえれば・・・。

sheet1.getRange("A2:B1000").clear();で毎回すべての値を消しているのはドライブからファイルがなくなった場合でも
常にスプレッドシートに書き込まれた内容が残ってしまうため、毎回消しています。

whileでcontents(要はフォルダの中身)がすべてなくなるまでループさせています。
fileにファイル名を代入し、nameにファイルのIDを代入しています。

後はスプレッドシートに書き出すだけですが、nameのほうに少し癖があります
IDしか取得してきていないため
"https://~~~"の値がないので手動で追記しています。
Gsuite等でドメインを取っている場合はURL指定にちょっと癖がありますが基本は
IDより前の部分は "d/"より前を丸っとコピー IDより後の部分は"/view?usp=sharing"あたりでしょうか
URLの確認方法は試しに一つエクセルをフォルダに入れて共有設定の部分のURLをご参照ください。

あとはグローバル変数でsheet1とかを設定している宿命為、変数の初期が必要になっているので毎回reset()で初期化しています。
これって参照する引数で設定してやれば不要ですよね・・・?書き方がいまいちわかっていません

ざっくりとこんな感じですが大丈夫ですかね・・・。
1年以上前に作成した物なので本人もだいぶ中身を忘れています。

何かの参考になればいいのですが・・・。

3
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?