質問: 0; i < latestPaidHour.length; i++ ){ return array.push(latestPaidHour); } Logger.log(latestPaidHour); }); Logger.log(sheet); } ``` ### 試したこと 最初は配列一つで、その中で作業が完結されるような書き方をしたかったのですが、何度やっても失敗したので、配列の数値を、 > > 1.ファイル名の指定 > > 2.ファイルIDの指定 > > 3.各ファイルにアクセスして、指定のセルから数値を取得し、配列に格納 > > > という順序で更新していくような形にしてみました。 最後の段階で、指定のセルから数値を取得し、Logger.logには各値を反映できていますが、それを配列に格納できません。 もしくは配列でなくとも、そのまま数値を現在開いている一括管理するスプレッドシートの指定の位置にそのままsetValueできれば問題はないです。 しかし、いろいろと調べては試してみるも、何が合っていて、間違っているのか区別がつかず、途方に暮れています。 また動作が少し遅いのでもっとシンプルな文にならないかなと思いながらも、どう改良できるかわかりません。 わからないことだらけで、申し訳ございませんが、どうぞよろしくお願いいたします。
回答: 現在の質問だと問題点が見えないです * 「数値を吸い上げるまではかなった」 `Logger.log(latestPaidHour);`は動作してないはず。 となると`Logger.log(sheet);`が出力をしているはずで、これは配列を出力しているはず(mapの結果なので) であれば、「Logger.logには各値を反映できていますが、それを配列に格納できません」というのは整合性が取れません。 →出力サンプルを提示いただけませんか。 * 書き込み これを開いているシートなんだと思いますが、概念的には ``` SpreadsheetApp.getActiveSheet.getRange(1,1,sheet.length, sheet[0].length).setValues(sheet); ``` なので、形をあわせるだけ。 * 動作が少し遅いのでもっとシンプルな文 シンプルにしたりmapを組み合わせることでは早める効果は今回の例では薄いと思います。遅い原因は毎回ファイルとフォルダを名前から探したり、各ファイルから値を拾ってきたりするところなので、原理的に大幅な改善が難しいです。 ジャストアイデアですが、↓のような対策をすると改善が期待できると思います。 1. ファイル名の重複がおこらないようなルール(同姓だと重複する)にして、ファイルidの探査をやめる (余談ですが、getFilesByNameはフォルダ無視して検索してくれるので、もし姓が重複しないなら、`DriveApp.getFilesByName`とすることで、現在のコードでもフォルダを無視して取得可能なはず) 2. ファイルidやフォルダidはあらかじめ、管理シートに記録しておく(プログラムを書く) (こちらは絶対量としてかかる時間はへらないのですが、例えば夜間に時間のかかる処理を逃がしておいて、ユーザが操作する時には応答を速くするという考えです。まあそもそも全体を夜間に処理したらいいのかもしれませんが) 今のコードの意味を(多分)破綻させないように縮約してみました。 ``` function paidHolidaySet(){ //社員を配列データとして格納 var users = [ 'akito','fujisawa','inoue']; var fileIDs = users.map(function(element) { //月末lmld=lastmonthlastday var dt = new Date(); var lmld = new Date(dt.getFullYear(), dt.getMonth(), 0) // YYYYMMDD形式に変換 var year_str = lmld.getFullYear(); var month_str = lmld.getMonth()+ 1; // monthはなんと0-11 var day_str = lmld.getDate(); var month_str = ('0' + month_str).slice(-2); var day_str = ('0' + day_str).slice(-2); return "作業月報_" + element + "_" + year_str + month_str + day_str; }) .map(function(element){ //フォルダー名をドライブから検索し、IDを取得 var folderID = DriveApp.getFoldersByName(element).next().getId(); // Logger.log(folderID); return DriveApp.getFolderById(folderID).getFilesByName(element).next().getId(); }); Logger.log(fileIDs); //スプレッドシートアプリから取得したIDのスプレッドシートを起動し、アクティブシート取得 var sheet = fileIDs.map(function(element){ var sht= SpreadsheetApp.openById(element); var st = sht.getActiveSheet(); var array = []; var latestPaidHour = st.getRange( 1,1 ).getValue(); //here getValuesをgetValueに変更 latestPaidHour = latestPaidHour.toString(); Logger.log(latestPaidHour); return latestPaidHour; //here forの意味がなさそうなのでやめた }); SpreadsheetApp.getActiveSheet.getRange(1,1,1,sheet.length).setValues([sheet]); //here 最初の1,1はA1。3つめの1は、どうも1回の操作で横一列しか取らないっぽい。ので固定値。 Logger.log(sheet); } ```